我已经找到了两种可以计算平均值、最大值、最小值、方差等的跨距移动窗口的解决方案。现在,我希望通过轴添加一个唯一值函数的计数。我指的是在一个过程中计算所有二维阵列。在
莱恩(纽比。独一无二(array)可以实现,但需要大量迭代来计算所有数组。我可能使用大到2000 x 2000的图像,所以迭代不是一个好的选择。这一切都是关于性能和记忆的有效性。在
这里有两种解决方案可以帮助您快速移动窗口:
第一个直接取自Erik Rigtorp的http://www.mail-archive.com/numpy-discussion@scipy.org/msg29450.html
import numpy as np
def rolling_window_lastaxis(a, window):
if window < 1:
raise ValueError, "`window` must be at least 1."
if window > a.shape[-1]:
raise ValueError, "`window` is too long."
shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
strides = a.strides + (a.strides[-1],)
return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
def rolling_window(a, window):
if not hasattr(window, '__iter__'):
return rolling_window_lastaxis(a, window)
for i, win in enumerate(window):
if win > 1:
a = a.swapaxes(i, -1)
a = rolling_window_lastaxis(a, win)
a = a.swapaxes(-2, i)
return a
filtsize = (3, 3)
a = np.zeros((10,10), dtype=np.float)
a[5:7,5] = 1
b = rolling_window(a, filtsize)
blurred = b.mean(axis=-1).mean(axis=-1)
第二个来自Alex Rogozhnikov,电话:http://gozhnikov.github.io/2015/09/30/NumpyTipsAndTricks2.html。在
^{pr2}$有没有办法在一个或两个解决方案中添加/实现一个唯一值函数的计数?在
<2D>基本上需要一个唯一的数组,比如一个过滤器平均数. 在
谢谢你
亚历克斯
np.mean
在给定轴上操作,而不进行任何复制。只看as_strided
数组的形状,它看起来比原始数组大得多。但是因为每个“窗口”都是一个视图,所以它不会占用任何额外的空间。像mean
这样的还原运算符可以很好地处理这种视图。在但是请注意,您的第二个示例警告
reshape
。它将创建一个副本;它复制所有这些窗口中的值。在unique
开头为所以马上就要做一个重塑的拷贝。它是一个拷贝,并且是1d。然后它对元素进行排序,寻找重复项等等
有很多方法可以找到
unique
行,但它们需要将行转换为大型结构化数组元素。实际上是将2d数组转换为unique
可以使用的1d。在这里有一种使用^{}'s ^{} 的方法,可以有效地提取滑动窗口。在
涉及的步骤:
推拉窗户。
重塑为二维阵列。{但是我们要保持这个向量化的效率。
沿合并块轴的轴排序。
沿着这个轴求微分并计算不同元素的数量,当加上
1
时,这将是每个滑动窗口中唯一值的计数,从而得到最终的预期结果。执行方式如下-
样本运行-
^{pr2}$混合方法
为了使它能与非常大的数组一起工作,为了将所有内容都放入内存中,我们可能需要保持一个循环,它将沿着输入数据的每一行进行迭代,如下-
混合方法-第二版
混合1的另一个版本,显式使用
np.lib.stride_tricks.as_strided
-相关问题 更多 >
编程相关推荐