numpy如何在1darray找到邻里的当地最低限度

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中实现这一目标的最佳方法是什么

编辑:解释最小值背后的推理:

  1. 5 - 它旁边的2号窗口是[12.3 12.3].5更小
  2. 2 - 向左[12.3,7]向右[6 9].2是分钟
  3. 5 - 向左[9 10]向右[9 17].5分是分

注意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(25)的数字是2个大小邻域中的最小数字.由于仅支持或边界条件,因此未检测到边界(52)处的数字.至于你的问题,我猜你也对他们感兴趣.要检测它们,最好先添加反射边界条件: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)