我正在处理一维数据数组。我正在寻找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之间增加。
任何想法都会受到赞赏。