Как индексировать ndarray другим ndarray? - PullRequest
0 голосов
/ 31 января 2019

Я занимаюсь машинным обучением в python / numpy, в котором я хочу проиндексировать 2-мерный ndarray с 1-D ndarray, чтобы я получил 1-D массив с индексированными значениями.

Я заставил его работать с некрасивым фрагментом кода, и я хотел бы знать, есть ли лучший способ, потому что это кажется неестественным для такой хорошей комбинации языка и модулей, как python + numpy.

   a = np.arange(50).reshape(10, 5) # Array to be indexed
   b = np.arange(9, -1, -2) # Indexing array
   print(a)
   print(b)
   print(a[b, np.arange(0, a.shape[1]).reshape(1,a.shape[1])])
   #Prints:
   [[ 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]
    [35 36 37 38 39]
    [40 41 42 43 44]
    [45 46 47 48 49]]

   [9 7 5 3 1]

   [[45 36 27 18  9]]

Это именно то, что я хочу (хотя технически это 2-ой снимок), но это кажется очень сложным.Есть ли более аккуратный и аккуратный способ?

Редактировать: Чтобы уточнить, я на самом деле не хочу одномерный массив, который был очень плохо объяснен.Я на самом деле хочу одно измерение с длиной 1, потому что это то, что мне нужно для его обработки позже, но это легко сделать с помощью оператора reshape().Извините за путаницу, я просто смешал свой реальный код с более общим вопросом.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Вам нужен одномерный массив, но вы включили вызов reshape, единственная цель которого - перевести массив из нужного формата в формат, который вам не нужен.

Прекратить изменение формы arange выход.Кроме того, вам не нужно явно указывать начальное значение 0:

result = a[b, np.arange(a.shape[1])]
0 голосов
/ 31 января 2019

Вы можете просто использовать np.diagonal, чтобы получить то, что вы хотите.Нет необходимости reshape или индексации.Сложной задачей здесь было определить шаблон, который вы хотите получить, который в основном является диагональными элементами матрицы a[b].

a = np.arange(50).reshape(10, 5) # Array to be indexed
b = np.arange(9, -1, -2) # Indexing array
print (np.diagonal(a[b]))
# [45 36 27 18  9]

Как упомянуто в комментариях @ user2357112, возвращение np.diagonalтолько для чтенияНа мой взгляд, было бы проблемой, если вы планируете добавить / изменить значения в этом окончательном списке желаемых.Если вы просто хотите распечатать их или использовать для дальнейшей индексации, все будет в порядке.

В соответствии с документами

Начиная с NumPy 1.9возвращает доступное только для чтения представление исходного массива.Попытка записи в результирующий массив приведет к ошибке.

В некоторых будущих выпусках будет возвращено представление чтения / записи, а запись в возвращенный массив изменит ваш исходный массив.Возвращенный массив будет иметь тот же тип, что и входной массив.

Если вы не записываете в массив, возвращаемый этой функцией, вы можете просто проигнорировать все вышеперечисленное.

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