numpy 如何取消循环操作

2019-06-06 17:46:26 +08:00
 going2think

有如下代码,请问该如何去掉两重 for 循环,使用 numpy 的数组操作来实现呢?谢谢各位了

import numpy as np

a = np.zeros((100, 100))
b = np.zeros((100, 100))
ds = []
for i in range(5, 95):
    for j in range(5, 95):
        pa = a[i-5:i+5, j-5:j+5]
        pb = b[i-5:i+5, j-5:j+5]
        d = pa - pb
        ds.append(d)

return ds
2129 次点击
所在节点    Python
5 条回复
necomancer
2019-06-06 22:25:24 +08:00
from skimage.util.shape import view_as_windows

a = np.random.random((100,100))
b = np.random.random((100,100))

ret = view_as_windows(a-b, (10,10))

In [1]: np.allclose(ret[:-1,:-1,:], ds.reshape(90,90,10,10))
Out[1]: True

顺带一提,view_as_windows 有 step 函数,你这个情况 step=1,是默认参数。
necomancer
2019-06-06 22:26:11 +08:00
step=10 在你的例子里应该相当于刚好无重叠,可以用 view_as_blocks 函数。
necomancer
2019-06-06 22:49:41 +08:00
这个函数基本上是在用 np.lib.stride_tricks.as_strided,所以如果你没有 skimage,去 skimage 找到那个函数拷过来就行。麻烦的地方只在怎么根据 window_size 和 step 算 stride
going2think
2019-06-06 23:33:17 +08:00
@necomancer 感谢帮助,我去试试~
xgdgsc
2019-06-07 20:35:48 +08:00
这种直接改 numba

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/571603

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX