Изменить указанный c список ячеек массива numpy - PullRequest
2 голосов
/ 21 января 2020

Предположим, у меня есть массив numpy, и я хочу изменить значения. У меня есть определенный c список (x, y) -координат, которые указывают ячейки, в которые должен быть добавлен дополнительный термин. Код ниже делает эту работу за меня.

>>> import numpy as np

n = 4
M = np.ones([n,n])
x = [0,1,2,3]
y = [1,2,3,0]
xy = list(zip(x,y))

alpha = 0.3

for i in range(n):

    for j in range(n):

        M[i,j] = alpha*M[i,j] + ((i,j) in xy)*(1-alpha)*3

>>> M
Out[1]: 
array([[0.3, 2.4, 0.3, 0.3],
       [0.3, 0.3, 2.4, 0.3],
       [0.3, 0.3, 0.3, 2.4],
       [2.4, 0.3, 0.3, 0.3]])

Тем не менее, я думаю, что есть менее обременительные способы добиться того же. Может ли кто-нибудь помочь мне избавиться, например, от двух циклов for?

Ответы [ 4 ]

3 голосов
/ 21 января 2020
n = 4

x = [0,1,2,3]
y = [1,2,3,0]

M = alpha*np.ones([n,n])
M[x,y] += (1-alpha)*3
3 голосов
/ 21 января 2020

Да, используя np.add.at.

Поскольку np.add - это ufunc, у него есть специальный метод at, который позволяет выполнять такие простые операции на месте.

M = np.ones([n,n]) * alpha

np.add.at(M, (x, y), (1-alpha)*3)

M
Out[]: 
array([[0.3, 2.4, 0.3, 0.3],
       [0.3, 0.3, 2.4, 0.3],
       [0.3, 0.3, 0.3, 2.4],
       [2.4, 0.3, 0.3, 0.3]])
1 голос
/ 21 января 2020

Для этого можно использовать индексирование кортежей:

M = np.ones((n,n))
N = np.zeros((n, n))

N[x, y] = np.ones(len(x))

M = alpha * M + N * (1 - alpha) * 3

или

N = np.zeros((n, n))
N[x, y] = np.ones(len(x))

M = np.where(N, alpha + (1 - alpha) * 3, alpha)
1 голос
/ 21 января 2020

Есть много способов, и один из них:

M=M*alpha
for i,j in zip(x,y):
  M[i,j] +=(1-alpha)*3
...