我试图在numpy数组上执行“正在运行的最大-最小窗口”,以便对于给定的窗口大小,该函数返回此窗口的最大值和最小值之间的距离。
我还想确定窗口的每个“跳过”的长度。
例如:
如果x_array = np.array([3,5,1,8,3,5,2,2])
大小为2
且跳过长度为2
的运行窗口将导致:
[2, 7, 2, 0]
,因为第一个窗口是3, 5
,第二个窗口是1,8
等。
当然可以使用简单的for循环来完成此操作,但我一直在努力寻找更好的解决方案。
任何帮助将不胜感激。
答案 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])