【问题标题】:Modify specific list of cells of a numpy array修改 numpy 数组的特定单元格列表
【发布时间】:2020-01-21 10:52:50
【问题描述】:

假设我有一个 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 循环吗?

【问题讨论】:

    标签: python numpy indexing cell


    【解决方案1】:
    n = 4
    
    x = [0,1,2,3]
    y = [1,2,3,0]
    
    M = alpha*np.ones([n,n])
    M[x,y] += (1-alpha)*3
    

    【讨论】:

      【解决方案2】:

      是的,使用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]])
      

      【讨论】:

        【解决方案3】:

        您可以为此使用元组索引:

        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)
        

        【讨论】:

          【解决方案4】:

          有很多方法,其中一种是:

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

          【讨论】:

            猜你喜欢
            • 2015-01-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-12-12
            • 1970-01-01
            相关资源
            最近更新 更多