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

Numpy矢量化:将上面的行添加到ndarray上的当前行,numpy,vectorization,numpy-ndarray,Numpy,Vectorization,Numpy Ndarray,我想使用矢量化将上面一行中的值添加到下面一行中。例如,如果我有Ndaray [[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.c

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

[[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 = 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]
或:


你可以试试下面的方法

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

您可以尝试以下方法

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

您可以创建第二个数组,其顶部行为零,所有其他行与原始数组的第一行到最后一行相同,但只有一行,然后将其添加到第一个数组中。如果它适合内存,那么应该足够快。这很有效。我只是想知道是否有一种更“numpythonic”的方法来解决这个问题。你可以创建第二个数组,上面的一行和所有其他行都为零,就像原始数组的第一行到最后一行,但只有一行,然后将其添加到第一个数组中。如果它适合内存,那么应该足够快。这很有效。我只是想知道是否有一种更“numpythonic”的方法来解决这个问题。为什么其他的解决方案会起作用?我对此有点困惑,因为b[1:]将是第一行之后的每一行,但我们添加最后一行是因为a[:-1]?我们将所有内容添加到并排除最后一行。尝试单独打印[:-1],与第一个示例中的添加完全相同。啊。我现在明白了。谢谢你的帮助!为什么替代方案有效?我对此有点困惑,因为b[1:]将是第一行之后的每一行,但我们添加最后一行是因为a[:-1]?我们将所有内容添加到并排除最后一行。尝试单独打印[:-1],与第一个示例中的添加完全相同。啊。我现在明白了。谢谢你的帮助!