如何在函数中找到相对最大值?

时间:2014-01-23 23:11:21

标签: python numpy

更具体地说,我需要找到函数的第二高的最大值。让我们说当我绘制函数时,我得到一个最大值(1,10),但我真正想要的是在(4,9)找到的最大值。现在我使用max(函数)来找到最大值。

我的问题:

  • 我使用了正确的功能吗?

  • 我是否使用边界?如果是这样,怎么样?

提前感谢您提供任何帮助!

2 个答案:

答案 0 :(得分:1)

I numpy> 1.8你可以使用np.partition来获得数组的第k个最大元素:

>>> a = np.arange(11)
>>> np.random.shuffle(a)
>>> a
array([10,  8,  0,  3,  2,  9,  4,  1,  7,  5,  6])
>>> np.partition(a, -2) # second to last element is in the right position
array([ 5,  6,  0,  3,  2,  8,  4,  1,  7,  9, 10])
>>> np.partition(a, -2)[-2]
9

答案 1 :(得分:1)

您可以使用scipy.ndimage.maximum_filter()查找本地最大值:

import numpy as np
from scipy import ndimage

Y, X = np.mgrid[-3:3:50j, -3:3:50j]

Z = 3 * (1 - X)**2 * np.exp(- X**2 - (Y + 1)**2) \
  - 10 * (X / 5 - X**3 - Y**5) * np.exp(-X**2 - Y**2) \
  - 1.0 / 3 * np.exp(-(X + 1)**2 - Y**2)

iy, ix = np.where(ndimage.maximum_filter(Z, size=(5, 5), mode="constant") == Z)

y, x, z = Y[iy, 0], X[0, ix], Z[iy, ix]

from matplotlib import pyplot as plt
fig, ax = plt.subplots()

ax.pcolormesh(X, Y, Z, cmap="gray")
ax.scatter(x, y, c=z, marker="x");

找到第二个峰值,只需numpy.argsort(z),并得到倒数第二个指数。

输出:

enter image description here