获得最频繁的两个连续数字

时间:2019-03-19 08:10:57

标签: python numpy

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]。 但是如何通过程序获取它?

2 个答案:

答案 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)]