Вы индексируете только по первой оси. Вам нужно:
a = np.full((8,8), False)
ix = np.array([[5, 6],[4, 5],[2, 5],[1, 6]])
a[ix[:,0], ix[:,1]] = True
Или мы могли бы также использовать np.add.at
здесь:
np.add.at(a,tuple(zip(*ix)),True)
print(a)
[[False False False False False False False False]
[False False False False False False True False]
[False False False False False True False False]
[False False False False False False False False]
[False False False False False True False False]
[False False False False False False True False]
[False False False False False False False False]
[False False False False False False False False]]
Имейте в виду, что индексируя, как вы , a[ix]
, вы индексируете только вдоль первой оси. Вы увидите более ясно на более простом примере:
ix = np.array([[1,2],[0,3],[2,2]])
a = np.arange(0,16).reshape(4,4)
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
Теперь, если вы индексируете вдоль первой оси, как вы делали, вы получите:
a[ix]
array([[[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[ 0, 1, 2, 3],
[12, 13, 14, 15]],
[[ 8, 9, 10, 11],
[ 8, 9, 10, 11]]])
В основном столько строк как значения в индексах, с формой индексного массива. Вы также должны указать , по каким столбцам (вторая ось) вы индексируете , как и в первом подходе, [ix[:,0]
по первой оси и ix[:,1]
по второй:
a[ix[:,0], ix[:,1]] = True