当我使用python实现一个滑动窗口来检测静止图像中的对象时,我开始了解这个很好的函数:
numpy.lib.stride_tricks.as_strided
Run Code Online (Sandbox Code Playgroud)
因此,我尝试实现一般规则,以避免在改变我需要的滑动窗口大小时可能失败的错误.最后我得到了这个代表:
all_windows = as_strided(x,((x.shape[0] - xsize)/xstep ,(x.shape[1] - ysize)/ystep ,xsize,ysize), (x.strides[0]*xstep,x.strides[1]*ystep,x.strides[0],x.strides[1])
Run Code Online (Sandbox Code Playgroud)
这导致4 dim矩阵.前两个表示图像的x和y轴上的窗口数.其他代表窗口的大小(xsize,ysize)
并且step表示两个连续窗口之间的位移.
如果我选择方形滑动窗口,这种表示可以正常工作.但我仍然有一个问题,让这个工作为ex(128,64)的窗口,我通常得到图像不相关的数据.
我的代码出了什么问题.有任何想法吗?如果有一个更好的方法来获得一个漂亮和整洁的python图像处理滑动窗口?
谢谢
我有一个大NumPy.array field_array而小的数组match_array,都由int值组成.使用以下示例,如何检查match_array形状的任何段是否field_array包含与其中的值完全对应的值match_array?
import numpy
raw_field = ( 24, 25, 26, 27, 28, 29, 30, 31, 23, \
33, 34, 35, 36, 37, 38, 39, 40, 32, \
-39, -38, -37, -36, -35, -34, -33, -32, -40, \
-30, -29, -28, -27, -26, -25, -24, -23, -31, \
-21, -20, -19, -18, -17, -16, -15, -14, -22, \
-12, -11, -10, -9, -8, -7, -6, -5, -13, \
-3, -2, -1, …Run Code Online (Sandbox Code Playgroud) 我喜欢使用许多已知信号形状的最小二乘匹配数据(一个numpy数组的浮点数).我的代码有效,但对于我打算做的很多次运行来说太慢了:
import numpy
import time
samples = 50000
width_signal = 100
data = numpy.random.normal(0, 1, samples)
signal = numpy.random.normal(0, 1, width_signal) # Placeholder
t0 = time.clock()
for i in range(samples - width_signal):
data_chunk = data[i:i + width_signal]
residuals = data_chunk - signal
squared_residuals = residuals**2
summed_residuals = numpy.sum(squared_residuals)
t1 = time.clock()
print('Time elapsed (sec)', t1-t0)
Run Code Online (Sandbox Code Playgroud)
编辑:纠正了一个错误:第一个方形残差,然后将它们相加.
在我的机器上运行大约需要0.2秒.由于我有许多数据集和信号形状,这太慢了.我的具体问题不允许使用典型的MCMC方法,因为信号形状太不同了.它必须是蛮力.
典型的数据量为50,000浮点数据和100个信号浮点数.这些可以变化几个因素.
我的测试表明:
numpy.sum(residuals)90%的时间.我尝试过Python sum(residuals),对于小型阵列(〜<50个元素)来说速度更快,对于更大的阵列来说速度更慢.我应该插入一个if条件吗?numpy.roll()而不是直接获取数据,而且.roll()速度较慢.问题: