【问题标题】:Argmax of numpy array returning non-flat indices返回非平面索引的 numpy 数组的 Argmax
【发布时间】:2012-03-17 23:03:33
【问题描述】:

我正在尝试获取 Numpy 数组中最大元素的索引。 这可以使用numpy.argmax 来完成。我的问题是,我想找到整个数组中最大的元素并获得它的索引。

numpy.argmax 可以沿一个轴应用,这不是我想要的,也可以在扁平阵列上应用,这正是我想要的。

我的问题是,当我想要多维索引时,将numpy.argmaxaxis=None 一起使用会返回平面索引。

我可以使用divmod 来获得非平面索引,但这感觉很难看。有没有更好的方法呢?

【问题讨论】:

    标签: python multidimensional-array numpy


    【解决方案1】:

    你可以在numpy.argmax()的结果上使用numpy.unravel_index()

    >>> a = numpy.random.random((10, 10))
    >>> numpy.unravel_index(a.argmax(), a.shape)
    (6, 7)
    >>> a[6, 7] == a.max()
    True
    

    【讨论】:

      【解决方案2】:
      np.where(a==a.max())
      

      返回最大元素的坐标,但必须解析数组两次。

      >>> a = np.array(((3,4,5),(0,1,2)))
      >>> np.where(a==a.max())
      (array([0]), array([2]))
      

      这与argmax 相比,返回等于最大值的所有元素的坐标。 argmax 只返回其中之一(np.ones(5).argmax() 返回0)。

      【讨论】:

      • 这将迭代数组三次,而不仅仅是两次。一次找到最大值,第二次构建== 的结果,第三次从该结果中提取True 值。请注意,可能有不止一项等于最大值。
      【解决方案3】:

      要获得所有出现最大值的非平面索引,您可以通过使用argwhere 而不是where 稍微修改eumiro 的answer

      np.argwhere(a==a.max())
      
      >>> a = np.array([[1,2,4],[4,3,4]])
      >>> np.argwhere(a==a.max())
      array([[0, 2],
             [1, 0],
             [1, 2]])
      

      【讨论】:

      • 这不是有效的,因为您获得了三个通道和一个矩阵创建。想象一下,我们有 9000x7000 图像 (A3@600dpi) - 你还会坚持你的解决方案吗?
      猜你喜欢
      • 2018-07-02
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 2017-04-02
      • 1970-01-01
      • 2017-02-21
      • 2021-06-30
      • 1970-01-01
      相关资源
      最近更新 更多