【问题标题】:Numpy array to replace a for loopNumpy 数组替换 for 循环
【发布时间】:2015-10-14 13:52:48
【问题描述】:

假设我有一个数组 A[i,j],我想通过执行以下操作来计算一个新数量 B[i,j]:

for i in arange(1, n):
    B[i,j+1] = a*A[i-1,j] + b*A[i,j]+ c*A[i+1,j]

我可以使用哪些 numpy 功能将其转换为纯数组操作?

我在考虑 np.cumprod 但不清楚如何将系数合并到计算中。

A.shape 将是 (n+1, j)。

【问题讨论】:

    标签: python arrays numpy vectorization


    【解决方案1】:

    定义A_left = A[:-2, :]A_middle = A[1:-1, :]A_right = A[2:, :]

    然后B = a*A_left + b*A_middle + c*A_right

    【讨论】:

    • 我认为作业部分应该是B[1:-1] = ..
    • 是的,但实际上这个问题有点不当,因为当 i 为 n-1 时,OP 的最后一行会引发 IndexError。
    • 这是因为 OP 很可能将 A 作为 n+1 作为占 A[i+1,j] 的行数。
    • 可能,但不确定 :) 因此“不合时宜”。好点,我刚刚在评论中询问了 A.shape。
    【解决方案2】:

    如果你不介意一点信号处理,你可以有一个通用的解决方案(通用的意思是你可以在abc 旁边分配更多元素用于缩放来自@987654326 的元素@) 使用signal.convolve2d

    这将类似于other solution,其中以更详细的方式处理与此类情况相关的卷积理论。实现看起来像这样 -

    from scipy import signal
    
    B = np.zeros_like(A)
    
    kernel = np.array([a,b,c])[::-1,None]
    B[1:-1]  = signal.convolve2d(A, kernel, boundary='symm', mode='valid')
    

    【讨论】: