首页 > 解决方案 > 使用 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 之间增加。

任何想法,将不胜感激。

标签: pythonarraysnumpy

解决方案


推荐阅读