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

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

【问题讨论】:

  • 如果有多个位置的值相同,您需要全部还是只需要第一个(或最后一个或任意一个)?

标签: python arrays indexing numpy


【解决方案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)。
  • 确实应该有一个内置函数来获取元组的值
【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2017-11-03
      • 2015-04-22
      • 2015-06-30
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      • 2014-06-28
      • 2018-04-10
      相关资源
      最近更新 更多