В MATLAB индексирование с помощью 2 списков (фактически матриц) выбирает блок. numpy
, с другой стороны, пытается транслировать индексные массивы друг против друга и возвращает выбранные точки. Его поведение близко к тому, что sub2ind
делает в MATLAB.
In [971]: arr = np.arange(16).reshape(4,4)
In [972]: arr
Out[972]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
In [973]: i1, i2 = np.array([0,2,3]), np.array([1,2,0])
Индексирование с 2 1d массивами одинакового размера:
In [974]: arr[i1,i2]
Out[974]: array([ 1, 10, 12])
Это, по сути, возвращает [arr[0,1], arr[2,2], arr[3,0]]
, один элемент для каждой точки совпадающих индексов.
Но если я превращаю один индекс в «вектор-столбец», он выбирает из строк, а i2
выбирает из столбцов.
In [975]: arr[i1[:,None], i2]
Out[975]:
array([[ 1, 2, 0],
[ 9, 10, 8],
[13, 14, 12]])
MATLAB упрощает индексацию блоков, а индивидуальный доступ сложнее. В numpy
доступ к блоку немного сложнее, хотя основная механика та же.
На вашем примере i1[0]
и i2[0]
могут быть такими массивами, как:
array([0, 2]), array([3])
(2,) (1,)
Массив shape (1,) также может транслироваться с массивом (2,) или (2,1). Ваш код потерпит неудачу, если вместо is[0]
будет np.array([0,1,2])
, массив (3,), который не может быть связан с массивом (2,). Но с (2,1) он производит (2,3) блок.