Ответ 1
In [1]: import numpy as np
In [2]: a = np.array([[2,0],[3,0],[3,1],[5,0],[5,1],[5,2]])
In [3]: b = np.zeros((6,3), dtype='int32')
In [4]: b[a[:,0], a[:,1]] = 10
In [5]: b
Out[5]:
array([[ 0, 0, 0],
[ 0, 0, 0],
[10, 0, 0],
[10, 10, 0],
[ 0, 0, 0],
[10, 10, 10]])
Почему это работает:
Если вы индексируете b
с двумя массивами numpy в присваивании,
b[x, y] = z
тогда подумайте о том, что NumPy перемещается одновременно по каждому элементу x
и каждому элементу y
и каждому элементу z
(назовем их xval
, yval
и zval
) и присваивая на b [xval, yval] значение zval
. Когда z
является константой, "перемещение по z
просто возвращает одно и то же значение каждый раз.
Это то, что мы хотим, причем x
является первым столбцом a
и y
, являющимся вторым столбцом a
. Таким образом, выберите x = a[:, 0]
и y = a[:, 1]
.
b[a[:,0], a[:,1]] = 10
Почему b[a] = 10
не работает
Когда вы пишете b[a]
, подумайте о NumPy как о создании нового массива, перемещаясь по каждому элементу a
(позвольте каждому из них idx
) и поместив в новый массив значение b[idx]
at расположение idx
в a
.
idx
- значение в a
. Так что это int32. b
имеет форму (6,3), поэтому b[idx]
представляет собой строку b
формы (3). Например, когда idx
есть
In [37]: a[1,1]
Out[37]: 0
b[a[1,1]]
является
In [38]: b[a[1,1]]
Out[38]: array([0, 0, 0])
So
In [33]: b[a].shape
Out[33]: (6, 2, 3)
Итак, повторите: NumPy создает новый массив, перемещаясь по каждому элементу a
и помещая в новый массив значение b[idx]
в местоположении idx
в a
. По мере того как idx
перемещается по a
, будет создан массив формы (6,2). Но так как b[idx]
сам по себе имеет форму (3), то в каждом месте в (6,2) -образном массиве помещается значение (3,). Результатом является массив формы (6,2,3).
Теперь, когда вы выполняете задание типа
b[a] = 10
создается временный массив формы (6,2,3) со значениями b[a]
, тогда выполняется присвоение. Поскольку 10 является константой, это присваивание помещает значение 10 в каждое место в (6,2,3) -образном массиве.
Затем значения из временного массива перенаправляются обратно на b
.
См. ссылка на документы. Таким образом, значения в (6,2,3) -образном массиве копируются обратно в массив (6,3) -образный b
. Значения переписывают друг друга. Но главное - вы не получаете заданий, которые вы желаете.