首页 > 解决方案 > 修改 numpy 数组的特定单元格列表

问题描述

假设我有一个 numpy 数组并且我想更改值。我有一个特定的 (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 循环吗?

标签: pythonnumpyindexingcell

解决方案


是的,使用np.add.at.

因为np.add是 a 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]])

推荐阅读