为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

子衿沉夜 2021-12-09 15:17:13
import itertools, numpy as npa = [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 回答

?
DIEA

TA贡献1820条经验 获得超2个赞

您可以连续对使用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然后用于生成连续的对 (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:]))


查看完整回答
反对 回复 2021-12-09
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

您可以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 pd

data = 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)]


查看完整回答
反对 回复 2021-12-09
  • 2 回答
  • 0 关注
  • 156 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信