【问题标题】:Numpy Vectorization: add row above to current row on ndarrayNumpy向量化:将上面的行添加到ndarray上的当前行
【发布时间】:2020-02-09 20:28:23
【问题描述】:

我想使用矢量化将上一行中的值添加到下一行。例如,如果我有 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))

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

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

【问题讨论】:

  • 您可以创建第二个数组,其顶行为零,所有其他行就像第一行到最后一行一样,但原始数组的一行,然后将其添加到第一个数组中。如果它适合内存,应该足够快。
  • 这行得通。我只是想知道是否有更“numpythonic”的方式来解决这个问题。

标签: numpy vectorization numpy-ndarray


【解决方案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]

或者:

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

【讨论】:

  • 为什么替代解决方案有效?我对此有点困惑,因为 b[1:] 将是第一行之后的每一行,但我们要添加最后一行,因为 a[:-1]?
  • 我们将所有内容添加到最后一行,但不包括最后一行。尝试单独打印 a[:-1] ,与第一个示例中的添加完全相同。
  • 啊。我现在明白了。感谢您的帮助!
【解决方案2】:

你可以试试下面的

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

【讨论】:

    猜你喜欢
    • 2011-06-13
    • 2019-07-12
    • 2012-08-11
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多