Вставка в массив с известными позициями и значениями - PullRequest
0 голосов
/ 17 апреля 2020
import numpy as np

a = np.zeros([2,2])

b = np.array([[0,0],
              [0,1],
              [1,0],
              [1,1]])

values = np.array([[10,20,30,40]]).T

#some function
#desired outcome for a as numpy array:

a = [[10,20],
     [30,40]]

Как видно из кода, у меня есть массив нулевых значений, который я хотел бы заполнить значениями. Мой вопрос: NumPy предлагает какую-либо функцию для этого? Я хотел бы найти элегантный способ, прежде чем использовать для l oop. Спасибо.

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

На простом подходе используется numpy индексирование:

import numpy as np

a = np.zeros([2, 2])

b = np.array([[0, 0],
              [0, 1],
              [1, 0],
              [1, 1]])

values = np.array([10, 20, 30, 40])

rows, cols = zip(*b)
a[rows, cols] = values
print(a)

Выход

[[10. 20.]
 [30. 40.]]

Альтернативой является использование csr_matrix конструктор от scipy:

import numpy as np
from scipy.sparse import csr_matrix

a = np.zeros([2, 2])

b = np.array([[0, 0],
              [0, 1],
              [1, 0],
              [1, 1]])

values = np.array([10, 20, 30, 40])

a = csr_matrix((values, zip(*b)), a.shape).todense()
print(a)

Вывод

[[10 20]
 [30 40]]
1 голос
/ 17 апреля 2020

Один путь будет с np.put_along_axis:

np.put_along_axis(a, b, values, 0)

Или, поскольку a - это массив нулей, мы также можем использовать np.add.at. Нам просто нужно изменить indices, чтобы он соответствовал размеру a:

np.add.at(a, tuple(zip(*b)), values.ravel())

print(a)
array([[10., 20.],
       [30., 40.]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...