NumPy ND数组中最频繁的元素

时间:2018-12-27 18:00:57

标签: python arrays numpy

我正在尝试查找并打印矩阵中最常见的数字,并尽可能使用numpy。

给出此列表(使用numpy.matrix(list)将其制成矩阵):

-rw-r--r--   35 30067    10224     <-- 2018-09
-rw-r--r--   36 30067    10224     <-- 2018-09
-rw-r--r--   65 30067    10224     <-- 2018-10-24

在这个例子中我应该得到:4 (因为它是最常见的数字)

2 个答案:

答案 0 :(得分:3)

给出:

>>> import numpy as np
>>> LoL = [[2,4,1,6,3], [2,4,1,8,4], [6,5,4,3,2], [6,5,4,3,4], [1,2,3,4,5]]
>>> matrix=np.array(LoL)
>>> matrix
[[2 4 1 6 3]
 [2 4 1 8 4]
 [6 5 4 3 2]
 [6 5 4 3 4]
 [1 2 3 4 5]]

您可以这样做:

>>> np.argmax(np.bincount(matrix.flat))
4

或者,

u, c = np.unique(your_lst, return_counts=True)
u[c.argmax()]
# 4

如果您希望不使用numpy或进行任何导入来计数列表列表中最频繁的条目,则可以使用字典来计数生成器以平化列表列表的每个元素:

cnts={}
for e in (x for sl in LoL for x in sl):
    cnts[e]=cnts.get(e, 0)+1

然后按最常排序:

>>> sorted(cnts.items(), key=lambda t: t[1], reverse=True)
[(4, 7), (2, 4), (3, 4), (1, 3), (5, 3), (6, 3), (8, 1)]

或者,如果您只想要最大的,只需使用max

>>> max(cnts.items(), key=lambda t: t[1])

答案 1 :(得分:1)

您不需要中间矩阵。您可以直接拼合列表以获得单个列表,然后使用bincount。它返回一个列表,其中每个数字的频率在与该数字相对应的索引位置处给出。因此,您使用argmax来获取相应的索引

import numpy as np
listt = [[2,4,1,6,3], [2,4,1,8,4], [6,5,4,3,2], [6,5,4,3,4], [1,2,3,4,5]]
flat = [i for j in listt for i in j]
counts = np.bincount(flat)
print (np.argmax(counts))
# 4