Numpy矢量化:将上面的行添加到ndarray上的当前行
我想使用矢量化将上面一行中的值添加到下面一行中。例如,如果我有NdarayNumpy矢量化:将上面的行添加到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
[[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],与第一个示例中的添加完全相同。啊。我现在明白了。谢谢你的帮助!