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 循环来完成,但我正在努力思考更好的解决方案。

任何帮助将不胜感激。

从这个答案中采用一点,你能做的是

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])

以下是使用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])

最新更新