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

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


子衿沉夜
浏览 157回答 2
2回答

DIEA

您可以连续对使用collections.Counter和迭代data:import numpy as npfrom collections import Countera = [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然后用于生成连续的对 (as 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:]))

婷婷同学_

您可以Counter按照@hiro 主角的建议使用,但由于您想一次处理一行,因此必须沿行应用它。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 pddata = np.array([a,b,c])df = pd.DataFrame(data)现在,沿行应用计数器:df.apply(lambda x: Counter(zip(x, x[1:])), axis = 1).sum().most_common(1)[((2, 3), 3)]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python