#python #arrays #numpy
#python #массивы #numpy
Вопрос:
Учитывая 2D массив numpy a
, я могу получить доступ к j-му элементу в каждой строке следующим образом:
>>> import numpy as np
>>> a = np.zeros((3,3))
>>> a
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
>>> j = np.array([0,1,0])
>>> j
array([0, 1, 0])
>>> i = np.arange(3)
>>> i
array([0, 1, 2])
>>> a[i,j] = 1
>>> a
array([[1., 0., 0.],
[0., 1., 0.],
[1., 0., 0.]])
Однако я ожидал бы, что доступ к строкам с помощью оператора двоеточия приведет к тому же:
>>> b = np.zeros((3,3))
>>> b[:,j] = 1
>>> b
array([[1., 1., 0.],
[1., 1., 0.],
[1., 1., 0.]])
Возможно ли добиться такого же поведения, как показано в первом примере, используя операторы двоеточия?
Как мне нужно изменить массив j
?
Комментарии:
1. Есть ли причина, по которой вы хотите использовать только двоеточие? Я не знаю такого способа доступа к элементам так, как вам нравится, с помощью двоеточия
2.
a[i,j]
примерно эквивалентно[a[x,y] for x,y in zip(i,j)]
, это сопряжение элементовi
иj
(черезbroadcasting
) .a[:,j]
означает взять все строки (фрагмент) иj
столбцы. Нет ничего похожего на трансляцию списка / массива.3. @Ehsan: Причина просто в том, чтобы углубить мое понимание numpy. Мой предлагаемый метод просто хорош с функциональной точки зрения.
4. На этой странице много прочитанного и понятного
indexing
, numpy.org/doc/stable/reference/arrays.indexing.html