在NumPy数组中查找最频繁的数字

183 投票
14 回答
273980 浏览
提问于 2025-04-16 19:01

假设我有一个这样的NumPy数组:

a = np.array([1,2,3,1,2,1,1,1,3,2,2,1])

我该如何找到这个数组中出现次数最多的数字呢?

14 个回答

54

如果你愿意使用 SciPy 这个库:

>>> from scipy.stats import mode
>>> mode([1,2,3,1,2,1,1,1,3,2,2,1])
(array([ 1.]), array([ 6.]))
>>> most_frequent = mode([1,2,3,1,2,1,1,1,3,2,2,1])[0][0]
>>> most_frequent
1.0
139

你可以使用

values, counts = np.unique(a, return_counts=True)

ind = np.argmax(counts)
print(values[ind])  # prints the most frequent element

ind = np.argpartition(-counts, kth=10)[:10]
print(values[ind])  # prints the 10 most frequent elements

如果有两个元素出现的频率一样,这段代码只会返回第一个元素。

250

如果你的列表里全是非负整数,可以看看numpy.bincounts这个功能:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.bincount.html

然后可能还需要用到np.argmax这个功能:

a = np.array([1,2,3,1,2,1,1,1,3,2,2,1])
counts = np.bincount(a)
print(np.argmax(counts))

如果你的列表比较复杂,可能包含负数或者不是整数的值,你可以用np.histogram来处理,方法类似。如果你想在python中处理这些数据,但不想用numpy,collections.Counter也是个不错的选择。

from collections import Counter
a = [1,2,3,1,2,1,1,1,3,2,2,1]
b = Counter(a)
print(b.most_common(1))

撰写回答