import itertools, numpy as np
a = [1,2,3,4,5]
b = [5,2,3,6,7]
c = [5,2,3,8,9]
获取最常用的电话号码:
data = np.array([a,b,c]).flatten()
print (data)
values, counts = np.unique(data, return_counts=True)
for value, frequency in zip(values, counts):
print (value, frequency)
如何获得最频繁的两个连续数字? 答案是[2,3]。 但是如何通过程序获取它?
答案 0 :(得分:4)
您可以使用collections.Counter
并在data
中连续对进行迭代:
import numpy as np
from collections import Counter
a = [1,2,3,4,5]
b = [5,2,3,6,7]
c = [5,2,3,8,9]
data = np.array([a,b,c]).flatten()
c = Counter(zip(data, data[1:]))
print(c.most_common(1))
# [((2, 3), 3)]
告诉您(2, 3)
发生了3次。
更多细节:
data[1:]
是您的data
,没有第一个元素。
zip(data, data[1:])
然后 zip
用于生成连续对(如tuples
)
(1, 2), (2, 3), (3, 4), (4, 5), (5, 5), (5, 2), (2, 3), ...
Counter
然后只计算出现的次数并像dict
一样存储它们:
Counter({(2, 3): 3, (5, 2): 2, (1, 2): 1, (3, 4): 1, (4, 5): 1, (5, 5): 1, (3, 6): 1,
(6, 7): 1, (7, 5): 1, (3, 8): 1, (8, 9): 1})
更新:如果您不想从其他列表中配对,则可以执行以下操作:
data = (a, b, c)
c = Counter()
for d in data:
c.update(zip(d, d[1:]))
print(c)
或直接:
c = Counter(pair for d in data for pair in zip(d, d[1:]))
答案 1 :(得分:1)
您可以按照@hiro主角的建议使用Counter
,但是由于您想一次处理一行,因此必须沿行应用。
from collections import Counter
使用numpy沿行应用:
data = np.array([a,b,c])
np.apply_along_axis(lambda x: Counter(zip(x, x[1:])), 1, data).sum().most_common(1)
[((2, 3), 3)]
或者,如果使用熊猫:
import pandas as pd
data = np.array([a,b,c])
df = pd.DataFrame(data)
现在,沿行应用Counter:
df.apply(lambda x: Counter(zip(x, x[1:])), axis = 1).sum().most_common(1)
[((2, 3), 3)]