【问题标题】:How to return all the minimum indices in numpy如何在numpy中返回所有最小索引
【发布时间】:2013-09-06 02:11:56
【问题描述】:

阅读argmin function in numpy 的文档我有点困惑。 看起来它应该可以完成这项工作:

阅读本文

沿轴返回最小值的索引。

我可能会认为

np.argmin([5, 3, 2, 1, 1, 1, 6, 1])

将返回一个包含所有索引的数组:[3, 4, 5, 7]

但不是这个,它只返回3。问题在哪里,或者我应该怎么做才能得到我的结果?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    当您考虑多维数组时,该文档会更有意义。

    >>> x = numpy.array([[0, 1],
    ...                  [3, 2]])
    >>> x.argmin(axis=0)
    array([0, 0])
    >>> x.argmin(axis=1)
    array([0, 1])
    

    指定轴后,argmin 沿给定轴获取一维子数组,并返回每个子数组最小值的第一个索引。它不会返回单个最小值的所有索引。

    要获取最小值的所有索引,您可以这样做

    numpy.where(x == x.min())
    

    【讨论】:

      【解决方案2】:

      请参阅numpy.argmax 的文档(numpy.argmin 的文档引用了该文档):

      如果最大值多次出现,则返回与第一次出现对应的索引。

      文档的措辞(“indices”而不是“index”)指的是提供axis 时的多维情况。

      所以,你不能用np.argmin 做到这一点。相反,这将起作用:

      np.where(arr == arr.min())
      

      【讨论】:

        【解决方案3】:

        我想快速补充一点,正如用户 grofte 提到的,np.where 返回一个元组,它声明它是 nonzero 的简写,它有一个相应的方法 flatnonzero,它直接返回一个数组。

        所以,最干净的版本似乎是

        my_list = np.array([5, 3, 2, 1, 1, 1, 6, 1])
        np.flatnonzero(my_list == my_list.min())
        => array([3, 4, 5, 7])
        

        【讨论】:

          【解决方案4】:

          假设你想要一个列表的索引,而不是一个 numpy 数组,试试

          import numpy as np
          
          my_list = [5, 3, 2, 1, 1, 1, 6, 1]
          np.where(np.array(my_list) == min(my_list))[0]
          

          索引 [0] 是因为 numpy 返回您的答案的元组,什么都没有(答案作为 numpy 数组)。不要问我为什么。

          【讨论】:

          • 这不起作用。平等不广播与 python 列表。
          • 哎呀,你是绝对正确的 Mark Rucker。编辑答案。
          猜你喜欢
          • 2021-07-09
          • 2018-07-02
          • 2016-03-06
          • 1970-01-01
          • 2018-09-30
          • 1970-01-01
          • 2023-03-24
          • 1970-01-01
          • 2021-09-26
          相关资源
          最近更新 更多