Выбор определенного столбца в каждой строке от массива

Я пытаюсь выбрать определенные элементы столбца для каждой строки массива 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]])

который ясно не является тем, что я ищу. Существует ли простой способ сделать то, что я хотел бы обойтись без использования циклов?

6
задан astrofrog 21 January 2010 в 17:04
поделиться

2 ответа

Вы можете использовать:

a[np.arange(3), (0,1,0)]

в вашем примере выше.

8
ответ дан 8 December 2019 в 18:36
поделиться

Это не столько ответ, сколько попытка немного задокументировать это. Для ответа выше мы бы имели:

>>> 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-значений) и восстановить эти специфические элементы из массива.

2
ответ дан 8 December 2019 в 18:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: