Python 用numpy求xy数据点图的局部极大值?

Python 用numpy求xy数据点图的局部极大值?,python,numpy,max,points,Python,Numpy,Max,Points,我想用最有效的方法在包含数千个值的巨大数据点集中找到局部极大值。作为输入,使用两个带有x和y值的长列表 考虑这个简单的例子: xval = [-0.15, -0.02, 0.1, 0.22, 0.36, 0.43, 0.58, 0.67, 0.79, 0.86, 0.96 ] yval = [-0.09, 0.13, -0.01, -0.1, -0.05, 0.2, 0.56, 0.47, 0.35, 0.43, 0.69] 期望的输出是带有峰值索引的列表,这里locMaxId=[1,6,

我想用最有效的方法在包含数千个值的巨大数据点集中找到局部极大值。作为输入,使用两个带有x和y值的长列表

考虑这个简单的例子:

xval = [-0.15, -0.02, 0.1, 0.22, 0.36, 0.43, 0.58, 0.67, 0.79, 0.86, 0.96 ]

yval = [-0.09, 0.13, -0.01, -0.1, -0.05, 0.2, 0.56, 0.47, 0.35, 0.43, 0.69]

期望的输出是带有峰值索引的列表,这里locMaxId=[1,6,10]。
比较最近的邻居是解决方案,但对于10k值?

您可以让numpy处理迭代,即将其矢量化:

def local_maxima(xval, yval):
    xval = np.asarray(xval)
    yval = np.asarray(yval)

    sort_idx = np.argsort(xval)
    yval = yval[sort_idx]
    gradient = np.diff(yval)
    maxima = np.diff((gradient > 0).view(np.int8))
    return np.concatenate((([0],) if gradient[0] < 0 else ()) +
                          (np.where(maxima == -1)[0] + 1,) +
                          (([len(yval)-1],) if gradient[-1] > 0 else ()))
而且速度相当快:

In [3]: xval = np.random.rand(10000)

In [4]: yval = np.random.rand(10000)

In [5]: local_maxima(xval, yval)
Out[5]: array([   0,    2,    4, ..., 9991, 9995, 9998], dtype=int64)

In [6]: %timeit local_maxima(xval, yval)
1000 loops, best of 3: 1.16 ms per loop

此外,大部分时间是将数据从列表转换为数组并对其进行排序。如果您的数据已经排序并保存在阵列中,您可能可以将性能提高5倍。

是的,这正是我一直在寻找的!也许你可以为没有经验的用户添加一些评论:)@pteack看看这是否有意义,我经常用Python比用英语更好地解释自己……是的,现在好多了!如果你想的话,那就难一点。
In [3]: xval = np.random.rand(10000)

In [4]: yval = np.random.rand(10000)

In [5]: local_maxima(xval, yval)
Out[5]: array([   0,    2,    4, ..., 9991, 9995, 9998], dtype=int64)

In [6]: %timeit local_maxima(xval, yval)
1000 loops, best of 3: 1.16 ms per loop