Я пытаюсь выбрать определенные элементы столбца для каждой строки массива numpy. Например, в следующем примере:
In [1]: a = np.random.random((3,2))
Out[1]:
array([[ 0.75670668, 0.1283942 ],
[ 0.51326555, 0.59378083],
[ 0.03219789, 0.53612603]])
Я хотел бы выбрать первый элемент первой строки, второй элемент второй строки и первый элемент третьей строки. Таким образом, я пытался сделать следующее:
In [2]: b = np.array([0,1,0])
In [3]: a[:,b]
Но это производит следующий вывод:
Out[3]:
array([[ 0.75670668, 0.1283942 , 0.75670668],
[ 0.51326555, 0.59378083, 0.51326555],
[ 0.03219789, 0.53612603, 0.03219789]])
который ясно не является тем, что я ищу. Существует ли простой способ сделать то, что я хотел бы обойтись без использования циклов?
Вы можете использовать:
a[np.arange(3), (0,1,0)]
в вашем примере выше.
Это не столько ответ, сколько попытка немного задокументировать это. Для ответа выше мы бы имели:
>>> import numpy as np
>>> A = np.array(range(6))
>>> A
array([0, 1, 2, 3, 4, 5])
>>> A.shape = (3,2)
>>> A
array([[0, 1],
[2, 3],
[4, 5]])
>>> A[(0,1,2),(0,1,0)]
array([0, 3, 4])
Указание списка (или кортежа) отдельных координат строк и столбцов позволяет причудливую индексацию массива. Первый пример в комментарии выглядит похожим на первый, но индексы - это срезы. Они не распространяются на весь диапазон, а форма - возвращаемого массива разная:
>>> A[0:2,0:2]
array([[0, 1],
[2, 3]])
Для второго примера в комментарии
>>> A[[0,1],[0,1]]
array([0, 3])
Похоже, что ломтики разные, но кроме этого, независимо от того, как строятся индексы, можно задать кортеж или список (x-значений, y-значений) и восстановить эти специфические элементы из массива.