numpy数组中max-min的运行窗口。

时间:2018-08-12 11:52:24

标签: python numpy

我试图在numpy数组上执行“正在运行的最大-最小窗口”,以便对于给定的窗口大小,该函数返回此窗口的最大值和最小值之间的距离。

我还想确定窗口的每个“跳过”的长度。

例如:

如果x_array = np.array([3,5,1,8,3,5,2,2])

大小为2且跳过长度为2的运行窗口将导致: [2, 7, 2, 0],因为第一个窗口是3, 5,第二个窗口是1,8等。

当然可以使用简单的for循环来完成此操作,但我一直在努力寻找更好的解决方案。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

采用this answer的一些内容,您可以做的是

from numpy.lib.stride_tricks import as_strided

def running_max_min(a, window_size, step_size):
    nrows = (a.size - window_size)//step_size + 1
    n = a.strides[0]
    s = as_strided(a, shape=(nrows, window_size), strides=(step_size*n, n))
    return s.ptp(1)

例如,

In [22]: running_max_min(x_array, 2, 2)
Out[22]: array([2, 7, 2, 0])

答案 1 :(得分:2)

以下是使用maximum and minimum filters from ndimage的解决方案:

import numpy as np

from scipy.ndimage import maximum_filter
from scipy.ndimage import minimum_filter

def max_minus_min(a, length, step=1):
    a = np.asarray(a)
    center = length//2 # shift the window to the right
    len_output = len(a)-length+1 # crop the output to keep only full windows
    max_a = maximum_filter(a, size=length, origin=-center, mode='nearest')[:len_output:step]
    min_a = minimum_filter(a, size=length, origin=-center, mode='nearest')[:len_output:step]
    return max_a - min_a

print(max_minus_min([3,5,1,8,3,5,2,2], 2, 2))  # array([2, 7, 2, 0])
print(max_minus_min([3,5,1,8,3,5,2,2], 2, 1))  # array([2, 4, 7, 5, 2, 3, 0])
print(max_minus_min([0, 0, 0, 0, 1, 0, 0, 0], 4, 1))  # array([0, 1, 1, 1, 1])
print(max_minus_min([0, 0, 0, 0, 1, 0, 0, 0], 4, 3))  # array([0, 1])