Одна строка для замены значений их индексами строк?

#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]])