我正在尝试测试数组中的值是否连续多次高于某个值。
例如
arr1 = np.array([1,2,1,3,4,5,6,7])
arr2 = np.array([1,2,1,3,4,2,6,7])
假设我想测试数组中的某项是否连续四个周期为 >=3
。测试将为 arr1
返回 true
,但为 arr2
返回 false
。
最佳答案
这是 convolution
的一种方式-
def cross_thresh_convolve(arr, thresh, N):
# Detect if arr crosses thresh for N consecutive times anywhere
return (np.convolve(arr>=thresh,np.ones(N,dtype=int))==N).any()
或者使用 binary-dilation
-
from scipy.ndimage.morphology import binary_erosion
def cross_thresh_erosion(arr, thresh, N):
return binary_erosion(arr>=thresh, np.ones(N)).any()
样本运行-
In [43]: arr1 = np.array([1,2,1,3,4,5,6,7])
...: arr2 = np.array([1,2,1,3,4,2,6,7])
In [44]: print cross_thresh_convolve(arr1, thresh=3, N=4)
...: print cross_thresh_erosion(arr1, thresh=3, N=4)
...: print cross_thresh_convolve(arr2, thresh=3, N=4)
...: print cross_thresh_erosion(arr2, thresh=3, N=4)
True
True
False
False
一般比较
为了涵盖一般比较,假设我们要寻找大于
或小于
,或者甚至只是比较一个值是否相等,我们可以使用 NumPy 内置比较函数来替换早期解决方案中的 arr>=thresh
部分,从而为我们提供通用实现,就像这样 -
def consecutive_comp_convolve(arr, comp, N, comparison=np.greater_equal):
return (np.convolve(comparison(arr,comp),np.ones(N,dtype=int))==N).any()
def consecutive_comp_erosion(arr, comp, N, comparison=np.greater_equal):
return binary_erosion(comparison(arr,comp), np.ones(N)).any()
因此,我们的具体案例运行将是 -
consecutive_comp_convolve(arr1, comp=3, N=4, comparison=np.greater_equal)
consecutive_comp_erosion(arr1, comp=3, N=4, comparison=np.greater_equal)
consecutive_comp_convolve(arr2, comp=3, N=4, comparison=np.greater_equal)
consecutive_comp_erosion(arr2, comp=3, N=4, comparison=np.greater_equal)
关于python - Numpy:数组项的测试高于某个值,连续 x 次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53228719/