von*_*dip 2 python numpy scipy
我有一份分类样本清单.它们按照样品时间排序,每个样品在前一个样品后一秒钟取样.我想在指定大小的邻域中找到最小值.
例如,给定邻域大小为2且以下样本大小:
samples = [ 5, 12.3, 12.3, 7, 2, 6, 9, 10, 5, 9, 17, 2 ]
Run Code Online (Sandbox Code Playgroud)
我期待以下输出:[5,2,5,2]在numpy/scipy中实现这一目标的最佳方法是什么
编辑:解释最小值背后的推理:
注意9不是min是左边有一个2窗口,右边有一个较小的值(2)
Ima*_*ngo 11
使用scipy argrelextrema:
>>> import numpy as np
>>> from scipy.signal import argrelextrema
>>> data = np.array([ 5, 12.3, 12.3, 7, 2, 6, 9, 10, 5, 9, 17, 2 ])
>>> radius = 2 # number of elements to the left and right to compare to
>>> argrelextrema(data, np.less, order=radius)
(array([4, 8]),)
Run Code Online (Sandbox Code Playgroud)
这表明位置4和8(2和5)的数字是2个大小邻域中的最小数字.由于仅支持或边界条件,因此未检测到边界(5和2)处的数字.至于你的问题,我猜你也对他们感兴趣.要检测它们,最好先添加反射边界条件:argrelextremaclipwrap
>>> new_data = np.pad(data, radius, mode='reflect')
>>> new_data
array([ 12.3, 12.3, 5. , 12.3, 12.3, 7. , 2. , 6. , 9. ,
10. , 5. , 9. , 17. , 2. , 17. , 9. ])
Run Code Online (Sandbox Code Playgroud)
利用具有相应边界条件的数据,我们现在可以应用previus极值检测器:
>>> arg_minimas = argrelextrema(new_data, np.less, order=radius)[0] - radius
>>> arg_minimas
array([ 0, 4, 8, 11])
Run Code Online (Sandbox Code Playgroud)
返回本地极值(在本例中为最小值np.less)在滑动窗口中发生的位置radius=2.
注意用包装边界条件包装数组后-radius修复+radius索引.reflectnp.pad
编辑:如果你对价值观感兴趣,而不是在立场,那么它是直截了当的:
>>> data[arg_minimas]
array([ 5., 2., 5., 2.])
Run Code Online (Sandbox Code Playgroud)