在NumPy数组中查找最频繁的数字
假设我有一个这样的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))