【问题标题】:Avoiding for loops to speed up the computation time with numpy使用 numpy 避免 for 循环以加快计算时间
【发布时间】:2019-10-06 12:58:07
【问题描述】:

我正在使用 1800 x 900 矩阵。对于矩阵中的每个单元格,我都需要做类似的操作,可以用一个例子来描述:

a1b1 a1b2 a1b3 .... a1b900
a2b1 a2b2 ..
.
a1800b1 ... ...   ..a1800b900

对于新矩阵中的每个单元格,我希望它的值等于其左上、上和右上邻居的总和。所以,我想要a2b2 = a1b1 + a1b2 + a1b3。对于顶行,它可以是与当前单元格相同的值。

我可以使用 2 个 for 循环轻松做到这一点,但有没有办法可以将它矢量化以加快整个过程?

【问题讨论】:

  • Numba 是speed up for loops 的好方法,并且在 Numpy 中运行良好。
  • 使用二维卷积?

标签: python numpy vectorization


【解决方案1】:

你可以像下面这样矢量化它

arr = np.arange(16).reshape(4,4)

arr2 = np.pad(arr, [(1,0), (1,1)], mode="constant")[:-1, :]

result = arr+arr2[:,0:-2]+arr2[:,1:-1]+arr2[:,2:]

说明

  • np.pad(arr, [(1,0), (1,1)], mode="constant") 在矩阵的左侧、右侧和顶部填充零。 index [:-1, :] 将删除最后一行,有效地将矩阵移动一行
  • arr2[:,0:-2], arr2[:,1:-1], arr2[:,2:] 将为arr 的每个对应元素提供左上、上和右上元素。如果没有元素,则为 0(在上一步中填充的零)

结果

## arr
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

## result
array([[ 0,  1,  2,  3],
       [ 5,  8, 12, 12],
       [17, 24, 28, 24],
       [29, 40, 44, 36]])

【讨论】:

    猜你喜欢
    • 2018-08-26
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    相关资源
    最近更新 更多