使用numpy跨步技巧在两个大小不同的移动窗口上进行操作

时间:2018-07-09 02:55:55

标签: python arrays numpy

我正在处理一维数据数组。我正在寻找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之间增加。

任何想法都会受到赞赏。

0 个答案:

没有答案