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


81

如何获得多维NumPy数组中最大值的位置(索引)?


如果有多个头寸值相等的头寸,您是否需要全部头寸,或者只需要第一个头寸(或最后一个或仅一个)?
Trilarion

Answers:


176

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)

1
但是我有一个多维数组。
kame 2010年

85
使用unravel_index(a.argmax(), a.shape)以获得指数为元组。
kennytm 2010年

3是什么意思?好吧,我明白了。我一直在寻找(1,0)。
kame 2010年

2
确实应该有一个内置函数来获取作为元组的值
endolith 2013年


6

(编辑)我指的是一个已经删除的旧答案。公认的答案是我的。我同意那argmax比我的答案更好。

这样做是否更具可读性/直观性?

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

要么,

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

4
不必要地缓慢,因为您可以计算最大值,然后将其与所有a进行比较。unravel_index(a.argmax(),a.shape)。
彼得

我之所以投票,是因为它不假设a中出现a.max()的次数。而a.argmax()将返回“首次”出现(在多维数组的情况下定义不明确,因为它取决于遍历路径的选择)。docs.scipy.org/doc/numpy/reference/generated/… 我也认为np.where()比np.nonzero()更自然/可读性更好。
FizxMike

2

您可以简单地编写一个函数(仅在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)

0

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

List = np.array([34, 7, 33, 10, 89, 22, -5])
_max = List.tolist().index(max(List))
_max
>>> 4
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.