Python 转移矩阵

4 投票
1 回答
7772 浏览
提问于 2025-04-18 17:01

我有一个这样的列表:

[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))

有没有现成的模块可以用来实现这个?

1 个回答

13

我不知道有没有现成的模块,但我会用这段代码,它很容易被改编:

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]]

如果需要的话,这里有一些细节解释:

  1. zip(a, a[1:]) 这个部分会把所有相邻的数字配对在一起。
  2. Counter 会统计每一对出现的次数。
  3. 这个for循环简单地把Counter生成的字典转换成你想要的矩阵/列表的形式。

撰写回答