Выберите, используя несколько массивов индексов из ndarray в numpy - PullRequest
0 голосов
/ 06 апреля 2020

Скажите, если у меня есть двумерный массив:

y = np.arange(35).reshape(5,7)
# array([[ 0,  1,  2,  3,  4,  5,  6],
#        [ 7,  8,  9, 10, 11, 12, 13],
#        [14, 15, 16, 17, 18, 19, 20],
#        [21, 22, 23, 24, 25, 26, 27],
#        [28, 29, 30, 31, 32, 33, 34]])

и выберите 2-й и 3-й элементы 1-го, 3-го и 5-го массивов следующим образом:

y[np.array([0,2,4]), 1:3]
# array([[ 1,  2],
#        [15, 16],
#        [29, 30]])

Я не могу найти способ репликации этого с использованием массивов вместо среза для индексации, следующее не работает, я должен быть в состоянии использовать массивы для индексации, так как иногда меня могут интересовать 2-й и 4-й элементы массивов и так далее:

y[np.array([0,2,4]), np.array([1,2])]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (3,) (2,)

Как мне достичь желаемой функциональности?

Ответы [ 4 ]

2 голосов
/ 06 апреля 2020

np.ix_ () разработан для этого типа проблемы.

def getSub():
    y = np.arange(35).reshape(5,7)
    locs = np.ix_([0,2,4],[1,2])
    return y[locs]


>>> getSub()
array([[ 1,  2],
       [15, 16],
       [29, 30]])
0 голосов
/ 06 апреля 2020

Вы можете попробовать использовать это y[np.array([[0,2,4]]*2),np.array([[1]*3,[2]*3])].T

0 голосов
/ 06 апреля 2020

Быстрый, грязный способ добиться этого с двойной индексацией.

y[np.array([0,2,4]),:][:,np.array([1,2])]
0 голосов
/ 06 апреля 2020

y[np.array([0,2,4]), np.array([[1],[2]])].T

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...