获取多维 NumPy 数组中最大值的位置

Posted

技术标签:

【中文标题】获取多维 NumPy 数组中最大值的位置【英文标题】:Get the position of the largest value in a multi-dimensional NumPy array 【发布时间】:2011-04-04 19:07:27 【问题描述】:

如何(索引)?

【问题讨论】:

如果有多个位置的值相同,您需要全部还是只需要第一个(或最后一个或任意一个)? 【参考方案1】:

argmax() 方法应该会有所帮助。

更新

(阅读评论后)我相信argmax() 方法也适用于多维数组。链接的文档给出了一个例子:

>>> a = array([[10,50,30],[60,20,40]])
>>> maxindex = a.argmax()
>>> maxindex
3

更新 2

(感谢KennyTM 的评论)您可以使用unravel_index(a.argmax(), a.shape) 将索引作为元组获取:

>>> from numpy import unravel_index
>>> unravel_index(a.argmax(), a.shape)
(1, 0)

【讨论】:

但是我有一个多维数组。 使用unravel_index(a.argmax(), a.shape) 将索引作为元组获取。 数字 3 是什么意思?好的,我明白了。我在寻找 (1,0)。 确实应该有一个内置函数来获取元组的值 unravel_index 文档:docs.scipy.org/doc/numpy-1.10.1/reference/generated/…【参考方案2】:

(编辑)我指的是一个已被删除的旧答案。接受的答案是在我之后。我同意argmax 比我的回答更好。

这样做不是更易读/更直观吗?

numpy.nonzero(a.max() == a)
(array([1]), array([0]))

或者,

numpy.argwhere(a.max() == a)

【讨论】:

不必要的慢,因为您计算了最大值,然后将其与所有 a 进行比较。 unravel_index(a.argmax(), a.shape). 我投了赞成票,因为它没有假设 a.max() 在 a 中的出现次数。而 a.argmax() 将返回“第一次”出现(在多维数组的情况下定义不明确,因为它取决于遍历路径的选择)。 docs.scipy.org/doc/numpy/reference/generated/… 我也认为 np.where() 是一个更自然/可读的选择,而不是 np.nonzero()。【参考方案3】:

您可以简单地编写一个函数(仅适用于 2d):

def argmax_2d(matrix):
    maxN = np.argmax(matrix)
    (xD,yD) = matrix.shape
    if maxN >= xD:
        x = maxN//xD
        y = maxN % xD
    else:
        y = maxN
        x = 0
    return (x,y)

【讨论】:

【参考方案4】:

另一种方法是将numpy 数组更改为list 并使用maxindex 方法:

List = np.array([34, 7, 33, 10, 89, 22, -5])
_max = List.tolist().index(max(List))
_max
>>> 4

【讨论】:

以上是关于获取多维 NumPy 数组中最大值的位置的主要内容,如果未能解决你的问题,请参考以下文章

获取多维数组中的最大值[重复]

在多维数组javascript或coffeescript中获取最大值

从Awk中的多维数组中的子数组获取最小值和最大值

如何从多维数组中获取每个索引的最大值-javascript

在 2D numpy 数组的每个滚动窗口中获取最大值

如何沿一个轴获取 NumPy 数组中最大元素的索引