在 numpy (1.8) 中,我想将此计算从 Python 循环中移出到更 numpy-ish 的东西中以获得更好的性能:
(width, height) = base.shape
(toolw, toolh) = tool.shape
for i in range(0, width-toolw):
for j in range(0, height-toolh):
zdiff[i,j] = (tool - base[i:i+toolw, j:j+toolh]).min()
base
是一个 ~2000x2000 数组,tool
是一个 25x25 数组。(背景背景:基地和工具是高度图,我试图找出最接近的工具移动基地的方法。)
我正在尝试使用一个跨步的技巧,从这个开始:
base_view = np.lib.stride_tricks.as_strided(base, shape=(2000, 2000, 25, 25),
strides=(base.strides * 2))
这将base_view[10,20]
是从 (10, 20) 左上角的 base 开始的 25x25 值数组。
但是,这因“阵列太大”而失败。从值测试来看,当数组的潜在大小(例如 2000*2000*25*25*8)超过 2^32-ish 并且它触发了将所有维度相乘的溢出检查时,它似乎会报告此问题。(我安装的是 32 位 Python)。
我觉得我错过了一些东西——为什么当步幅值明显有效时它不能让我创建这个“步幅视图”?有没有办法强制这样做?
更一般地说,有没有办法优化我上面的循环?
更新:确切错误:
ValueError Traceback (most recent call last)
<ipython-input-14-313b3d6c74fa> in <module>()
----> 1 newa = np.lib.stride_tricks.as_strided(base, shape=(1000, 1000, 25, 25), strides=(base.strides * 2))
C:\Python27\lib\site-packages\numpy\lib\stride_tricks.pyc in as_strided(x, shape, strides)
28 if strides is not None:
29 interface['strides'] = tuple(strides)
---> 30 array = np.asarray(DummyArray(interface, base=x))
31 # Make sure dtype is correct in case of custom dtype
32 array.dtype = x.dtype
C:\Python27\lib\site-packages\numpy\core\numeric.pyc in asarray(a, dtype, order)
458
459 """
--> 460 return array(a, dtype, copy=False, order=order)
461
462 def asanyarray(a, dtype=None, order=None):
ValueError: array is too big.