我有一个看起来像这样的列表:
[2, 1, 3, 1, 2, 3, 1, 2, 2, 2]
我想要的是一个转换矩阵,它显示如下序列:
- 1 后跟 1 的频率是多少
- 1 后跟 2 的频率
1 后跟 3 的频率
2 后跟 1 的频率是多少
- 2 后跟 2 的频率是多少
- 2 后跟 3 的频率
等等……
((0,2,1), (1,2,1), (2,0,0))
有预制模块吗?
最佳答案
我不知道是否有模块,但我会使用这段代码,它很容易概括:
import numpy as np
from collections import Counter
a = [2, 1, 3, 1, 2, 3, 1, 2, 2, 2]
b = np.zeros((3,3))
for (x,y), c in Counter(zip(a, a[1:])).iteritems():
b[x-1,y-1] = c
print b
array([[ 0., 2., 1.],
[ 1., 2., 1.],
[ 2., 0., 0.]])
没有安装 numpy:
b = [[0 for _ in xrange(3)] for _ in xrange(3)]
for (x,y), c in Counter(zip(a, a[1:])).iteritems():
b[x-1][y-1] = c
print b
[[0, 2, 1], [1, 2, 1], [2, 0, 0]]
如果需要,一些正在发生的事情的细节:
zip(a, a[1:])
获取所有的连续数字对。Counter
计算每对出现的次数- for 循环简单地将
Counter
生成的字典转换为您请求的矩阵/列表列表
关于Python 转换矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25269476/