【问题标题】:How to make numpy.argmax return all occurrences of the maximum?如何让 numpy.argmax 返回所有出现的最大值?
【发布时间】:2013-07-10 10:44:05
【问题描述】:

我正在尝试找到一个函数,该函数返回给定列表中所有次出现的最大值。

numpy.argmax 但是只返回它找到的第一个匹配项。例如:

from numpy import argmax

list = [7, 6, 5, 7, 6, 7, 6, 6, 6, 4, 5, 6]
winner = argmax(list)

print winner

只给出索引0。但我希望它给出所有索引:0, 3, 5

【问题讨论】:

    标签: python numpy max


    【解决方案1】:

    正如np.argmax 的文档所说:“如果多次出现最大值,则返回与第一次出现相对应的索引。”,因此您将需要另一种策略。 p>

    您可以选择将np.argwherenp.amax 结合使用:

    >>> import numpy as np
    >>> listy = [7, 6, 5, 7, 6, 7, 6, 6, 6, 4, 5, 6]
    >>> winner = np.argwhere(listy == np.amax(listy))
    >>> print(winner)
     [[0]
      [3]
      [5]]
    >>> print(winner.flatten().tolist()) # if you want it as a list
    [0, 3, 5]
    

    【讨论】:

    • 很容易被amax中的a混淆:它代表array,而不是arg。使用maxamax 的别名)可能比使用amax 本身更好。
    【解决方案2】:

    与其他答案相比,如果您使用np.flatnonzero,则更容易:

    >>> import numpy as np
    >>> your_list = np.asarray([7, 6, 5, 7, 6, 7, 6, 6, 6, 4, 5, 6])
    >>> winners = np.flatnonzero(your_list == np.max(your_list))
    >>> winners
    array([0, 3, 5])
    

    如果你想要一个列表:

    >>> winners.tolist()
    [0, 3, 5]
    

    【讨论】:

      【解决方案3】:

      如果重要,以下算法在 O(n) 而不是 O(2n) 中运行(即,使用 np.argmax 然后 np.argwhere):

      def allmax(a):
          if len(a) == 0:
              return []
          all_ = [0]
          max_ = a[0]
          for i in range(1, len(a)):
              if a[i] > max_:
                  all_ = [i]
                  max_ = a[i]
              elif a[i] == max_:
                  all_.append(i)
          return all_
      

      【讨论】:

        【解决方案4】:

        简单多了……

        list[list == np.max(list)]

        【讨论】:

        • 是的,但是使用 argwhere 返回最大值出现的索引,这是@Marieke_W 要求的
        • 不是这个问题的答案,而且计算能力较差。
        猜你喜欢
        • 2011-10-25
        • 2021-03-26
        • 1970-01-01
        • 1970-01-01
        • 2015-06-02
        • 2011-08-22
        • 1970-01-01
        • 2021-02-28
        • 1970-01-01
        相关资源
        最近更新 更多