#numpy
#numpy
Вопрос:
У меня есть массив numpy
a = np.array([[1,0,0,1,0],
[0,1,0,0,0],
[0,0,1,0,1]])
Я хотел бы заменить все положительные элементы этого массива на его строку index 1
. Таким образом, конечный результат будет:
a = np.array([[1,0,0,1,0],
[0,2,0,0,0],
[0,0,3,0,3]])
Могу ли я сделать это с помощью простой команды numpy (без зацикливания)?
Ответ №1:
Использовать numpy.arange
(a != 0) * np.reshape(np.arange(a.shape[0]) 1, (-1, 1))
Вывод:
array([[1., 0., 0., 1., 0.],
[0., 2., 0., 0., 0.],
[0., 0., 3., 0., 3.]])
Работает с любым массивом:
a2 = np.array([[1,0,0,-1,0],
[0,20,0,0,0],
[0,0,-300,0,30]])
(a2 != 0) * np.reshape(np.arange(a2.shape[0]) 1, (-1, 1))
Вывод:
array([[1., 0., 0., 1., 0.],
[0., 2., 0., 0., 0.],
[0., 0., 3., 0., 3.]])
Комментарии:
1. Конкретная причина использовать
nan_to_num(a/a)
и не(a != 0)
использовать?2. @tobias_k лол, как я мог это пропустить. Спасибо, что указали
Ответ №2:
Не уверен, что это правильный numpy
способ, но вы могли бы использовать enumerate
и умножать подмассивы на их индексы:
>>> np.array([x * i for i, x in enumerate(a, start=1)])
array([[1, 0, 0, 1, 0],
[0, 2, 0, 0, 0],
[0, 0, 3, 0, 3]])
Обратите внимание, что это работает правильно, только если «каждый положительный элемент» на самом деле 1
, как в вашем примере, и если нет отрицательных элементов. В качестве альтернативы, вы можете использовать a > 0
для первого получения массива с True
(т. Е. 1
) в каждом месте, где a
есть > 0
, и False
(т. Е. 0
) в противном случае.
>>> a = np.array([[ 1, 0, 0, 2, 0],
... [ 0, 3, 0, 0,-8],
,,, [-3, 0, 4, 0, 5]])
...
>>> np.array([x * i for i, x in enumerate(a > 0, start=1)])
array([[1, 0, 0, 1, 0],
[0, 2, 0, 0, 0],
[0, 0, 3, 0, 3]])