回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我最近了解了<a href="https://stackoverflow.com/questions/4923617/efficient-numpy-2d-array-construction-from-1d-array">answer to this post</a>中的<a href="http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.strides.html" rel="noreferrer">strides</a>,并想知道如何使用它们比我在<a href="https://stackoverflow.com/questions/4829738/speed-up-a-program-that-calculate-the-average-of-the-neighbors-in-a-huge-array/4830102#4830102">this post</a>(使用卷积滤波器)中建议的更有效地计算移动平均滤波器。</p>
<p>这就是我目前所拥有的。它获取原始数组的视图,然后将其按所需数量滚动,并对内核值求和以计算平均值。我知道边缘处理不正确,但我可以在以后处理。。。有更好更快的方法吗?其目标是过滤大小高达5000x5000 x 16层的大型浮点数组,这项任务的速度相当慢。</p>
<p>请注意,我正在寻找8邻连接性,即3x3滤波器取9个像素的平均值(焦点像素周围8个像素),并将该值分配给新图像中的像素。</p>
<pre><code>import numpy, scipy
filtsize = 3
a = numpy.arange(100).reshape((10,10))
b = numpy.lib.stride_tricks.as_strided(a, shape=(a.size,filtsize), strides=(a.itemsize, a.itemsize))
for i in range(0, filtsize-1):
if i > 0:
b += numpy.roll(b, -(pow(filtsize,2)+1)*i, 0)
filtered = (numpy.sum(b, 1) / pow(filtsize,2)).reshape((a.shape[0],a.shape[1]))
scipy.misc.imsave("average.jpg", filtered)
</code></pre>
<p>编辑关于我如何看待此工作的说明:</p>
<p>当前代码:</p>
<ol>
<li>使用stride_技巧生成一个数组,如[[0,1,2],[1,2,3],[2,3,4]…],它对应于过滤器内核的顶行。</li>
<li>沿垂直轴滚动以获得内核的中间行[[10,11,12],[11,12,13],[13,14,15]…]并将其添加到我在1中获得的数组中)</li>
<li>重复以获取内核的最下面一行[[20,21,22],[21,22,23],[22,23,24]…]。在这一点上,我取每一行的和除以过滤器中的元素数,得到每个像素的平均值(移动1行和1列,边缘有一些奇怪的地方,但我可以稍后处理)。</li>
</ol>
<p>我所希望的是更好地使用stride_技巧,直接获取整个数组的9个值或内核元素的总和,或者有人能说服我使用另一种更有效的方法。。。</p>