2 回答
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:]))
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)]
添加回答
举报