我试图找到一个函数,它返回给定列表中所有出现的最大值。
numpy.argmax
然而只返回它找到的第一个匹配项。例如:
from numpy import argmax
list = [7, 6, 5, 7, 6, 7, 6, 6, 6, 4, 5, 6]
winner = argmax(list)
print winner
只给出 index 0
。但我希望它给出所有索引:0, 3, 5
.
我试图找到一个函数,它返回给定列表中所有出现的最大值。
numpy.argmax
然而只返回它找到的第一个匹配项。例如:
from numpy import argmax
list = [7, 6, 5, 7, 6, 7, 6, 6, 6, 4, 5, 6]
winner = argmax(list)
print winner
只给出 index 0
。但我希望它给出所有索引:0, 3, 5
.
正如文档np.argmax
所说:“如果多次出现最大值,则返回与第一次出现相对应的索引。” ,因此您将需要另一种策略。
您拥有的一种选择是np.argwhere
结合使用np.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]
与其他答案相比,如果您使用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]
万一它很重要,以下算法在 O(n) 而不是 O(2n) 中运行(即,使用np.argmax
and then 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_
简单多了...
列表[列表 == np.max(列表)]