python - 使用 numpy stride-tricks 对两个不同大小的移动窗口进行操作
问题描述
我正在处理一维数据数组。我正在寻找 7 项目窗口内大于预期的差异,但随后需要在更大的 20 项目窗口内更正值。
我正在使用 python 和 NumPy 来完成任务。我开始使用 numpy stride_tricks 通过原始数组创建一个移动窗口。Stride_tricks 似乎是在较小窗口中找到较高方差的最快计算方法。尝试扩展窗口以更正数据时卡住了。
这是我当前的代码:
with open('Sather-line-352-original.txt') as f:
array = np.array(map(int, f))
# shape defines the dimensions of the new temp array.
# strides define memory-based coordinates of original array items.
def pystride(array,frame_length,strided_items):
num_frames = 1 + ((len(array) - frame_length)/ strided_items)
row_stride = array.itemsize * strided_items
col_stride = array.itemsize
a_strided = np.lib.stride_tricks.as_strided(
array,
shape=(num_frames, frame_length),
strides=(row_stride, col_stride)
)
return a_strided
def find_max_min(array):
max_diff = 120
for sub in pystride(array,frame_length=7,strided_items=2):
max_val = max(sub)
min_val = min(sub)
if abs(max_val - min_val) >= max_diff:
# assign 'pointers' in original array indicating where large diffs are found.
sub[0] = int('{:<05}'.format(sub[0]))
find_max_min(array)
特别是,有没有办法确定 as_strided 子数组在原始数组中的位置?我一直在通过在整数值的末尾附加 000 来修改数据,以充当临时指针,但这似乎充其量只是一个 hack。我可以暂时调整子阵列的大小以进行修改,然后调整回较小的窗口以继续扫描吗?
这是数组的片段:93,94,91,90,93,85,79,60,50,48,54,58,47,49,63,91,134,165,184,178,161,161,154,151,140,129,113,87,51,23,14,17, 33,59,91,127,154,165,165,160,163
当值在 7 个值中从 140 下降到 14 时,会出现需要校正的数据示例。发现这意味着从 23 到 33 的所有内容都需要在 51 到 59 之间增加。
任何想法,将不胜感激。