In [92]: data = np.arange(12).reshape(3,4)
In [93]: x,y = np.arange(3), np.arange(4)
In [94]: data[x,y]
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-94-8bd18da6c0ef> in <module>
----> 1 data[x,y]
IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (3,) (4,)
Когда вы предоставляете 2 или более массивов в качестве индексов, numpy
транслирует их друг против друга. Важно понимать broadcasting
.
В MATLAB, обеспечивающем два индексных массива (фактически 2d матрицы), выбирает блок. В numpy для массивов, если они совпадают по форме, извлекаются элементы, например, по диагонали:
In [99]: data[x,x]
Out[99]: array([ 0, 5, 10])
Для эквивалента MATLAB требуется дополнительная функция, «indexs to sub» или какое-то подобное имя.
Двухступенчатое индексирование:
In [95]: data[:,y][x,:]
Out[95]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
ix_
- это удобный инструмент для построения индексов для доступа к блоку:
In [96]: data[np.ix_(x,y)]
Out[96]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
Обратите внимание на то, что он производит:
In [97]: np.ix_(x,y)
Out[97]:
(array([[0],
[1],
[2]]), array([[0, 1, 2, 3]]))
это то же самое, что и:
In [98]: data[x[:,None], y]
Out[98]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
x[:,None]
- (3,1), y
- (4,); они передают, чтобы произвести (3,4) выбор.