Numpy 向量化:将上面的行添加到 ndarray 上的当前行

Numpy Vectorization: add row above to current row on ndarray

我想使用矢量化将上一行中的值添加到下一行。例如,如果我有 ndarray,

[[0, 0, 0, 0],
 [1, 1, 1, 1],
 [2, 2, 2, 2],
 [3, 3, 3, 3]]

然后通过此方法迭代一次后,将导致

[[0, 0, 0, 0],
 [1, 1, 1, 1],
 [3, 3, 3, 3],
 [5, 5, 5, 5]]

可以简单地使用 for 循环来完成此操作:

import numpy as np

def addAboveRow(arr):
    cpy = arr.copy()

    r, c = arr.shape
    for i in range(1, r):
        for j in range(c):
            cpy[i][j] += arr[i - 1][j]

    return cpy

ndarr = np.array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3]).reshape(4, 4)
print(addAboveRow(ndarr))

虽然我不确定如何使用矢量化来解决这个问题。我认为应该使用切片器?另外,我不太确定如何处理顶部边框的问题,因为第一行不应添加任何内容。任何帮助,将不胜感激。谢谢!

注意:我对矢量化真的很陌生,所以解释会很好!

可以直接使用索引:

b = np.zeros_like(a)
b[0] = a[0]
b[1:] = a[1:] + a[:-1]
>>> b
array([[0, 0, 0, 0],
       [1, 1, 1, 1],
       [3, 3, 3, 3],
       [5, 5, 5, 5]])

备选方案:

b = a.copy()
b[1:] += a[:-1]

或者:

b = a.copy()
np.add(b[1:], a[:-1], out=b[1:])

您可以尝试以下方法

np.put(arr, np.arange(arr.shape[1], arr.size), arr[1:]+arr[:-1])