Для простого индексирования 2d массива работают обе формы:
In [28]: x = np.arange(6).reshape(2,3)
In [29]: x
Out[29]:
array([[0, 1, 2],
[3, 4, 5]])
In [30]: x[1,2]
Out[30]: 5
In [31]: x[1][2]
Out[31]: 5
Для np.matrix
(который вы, вероятно, не должны использовать в любом случае) они не являются:
In [32]: X = np.matrix(x)
In [33]: X
Out[33]:
matrix([[0, 1, 2],
[3, 4, 5]])
In [34]: X[1,2]
Out[34]: 5
In [35]: X[1][2]
...
IndexError: index 2 is out of bounds for axis 0 with size 1
Эти две формы синтаксически не одинаковы. [1][2]
сначала индексирует с 1, а затем индексирует результат с 2. Это не то же самое, что индексирование по обоим параметрам один раз.
In [36]: x[1]
Out[36]: array([3, 4, 5]) # (3,) shape
In [37]: X[1]
Out[37]: matrix([[3, 4, 5]]) # (1,3) shape
Ошибка возникает потому, что np.matrix
возвращает еще один np.matrix
. Таким образом, следующее индексирование [2]
снова будет индексировать первое измерение.
x[1]
действительно коротко для x[1,:]
, то есть индексировать первое измерение и нарезать все остальное (или X[1,...]
, чтобы учесть 3d и выше). Так что x[1][2]
на самом деле
temp = x[1,:]
temp[2]
или для матрицы:
temp = X[1,:]
temp[2,:]
Другими словами, это 2 операции индексации. Это выражение Python, а не конкретное numpy
использование.
Когда мы индексируем списки или фрагменты, разница между этими двумя формами становится более значительной, особенно при установке значений.
Я рекомендую новичкам использовать форму x[i,j]
. Не используйте x[1][2]
, если вы действительно не понимаете, что происходит.
При необходимости я могу узнать, как индексирование переводится в вызовы __setitem__
и __getitem__
.