如何在python中获取数组中多个最大值的值

时间:2015-12-31 21:26:50

标签: python numpy

我有一个数组

a =[0,  0, 15, 17, 16, 17, 16, 12, 18, 18]

我正在尝试查找max计数的元素值。如果存在平局,我希望所有具有相同max计数的元素。

你可以看到有两个0,两个16,两个17,两个18一个15和一个12 所以我想要一些会回归的东西 [0, 16, 17, 18](顺序不重要,但我不想要15或12)

我正在做np.argmax(np.bincount(a))但是argmax只返回一个元素(根据其文档)所以我只得到第一个为0

我试过了 np.argpartition(values, -4)[-4:]有效,但实际上我不知道有4个元素具有相同的计数! (也许我在这附近!!!灯泡刚刚开始!!!)

3 个答案:

答案 0 :(得分:8)

您可以使用np.unique获取计数和一系列唯一元素,然后拉出计数等于最大值的元素:

import numpy as np

a = np.array([0, 0, 15, 17, 16, 17, 16, 12, 18, 18])

un,  cnt = np.unique(a, return_counts=True)

print(un[cnt == cnt.max()])
[ 0 16 17 18]

un是唯一元素,cnt是每个元素的频率/数量:

In [11]: a = np.array([0, 0, 15, 17, 16, 17, 16, 12, 18, 18])

In [12]: un,  cnt = np.unique(a, return_counts=True)

In [13]: un, cnt
Out[13]: (array([ 0, 12, 15, 16, 17, 18]), array([2, 1, 1, 2, 2, 2]))

cnt == cnt.max()将为我们提供掩码来拉取等于max的元素:

In [14]: cnt == cnt.max()
Out[14]: array([ True, False, False,  True,  True,  True], dtype=bool)

答案 1 :(得分:0)

这有点繁琐,但您可以使用Counteritemgetter实现此目的:

from collections import Counter
from operator import itemgetter

a =[0, 0, 15, 17, 16, 17, 16, 12, 18, 18]
counter_list = Counter(a).most_common()
max_occurrences = max(counter_list, key=itemgetter(1))[1]
answer = [item[0] for item in counter_list if item[1] == max_occurrences]
print(answer)

<强>输出

[0, 16, 17, 18]

答案 2 :(得分:0)

这是一个简洁的解决方案:

from collections import Counter
import numpy as np

a = np.array([0, 0, 15, 17, 16, 17, 16, 12, 18, 18])
freq_count = Counter(a)
high = max(freq_count.values())
res = [key for key in freq_count.keys() if freq_count[key]==high]

输出:[0 16 17 18]

注意:输出顺序无法保证