Python转换矩阵

Flo*_*Flo 4 python transitions

我有一个看起来像这样的列表:

[2,1,3,1,2,3,1,2,2,2]

我想要的是一个转换矩阵,它向我显示如下序列:

  • 1经常是1,然后是1
  • 1经常是2经常是2
  • 1经常是3次

  • 2的频率是1,然后是1

  • 2经常是2经常是2
  • 2经常是3经常是3

等等...

((0,2,1),(1,2,1),(2,0,0))

有预制模块吗?

Kor*_*rem 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.]])
Run Code Online (Sandbox Code Playgroud)

没有安装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]]
Run Code Online (Sandbox Code Playgroud)

如果需要,可以详细说明发生了什么:

  1. zip(a, a[1:]) 得到所有连续数字对.
  2. Counter 计算每对出现的次数
  3. for循环简单地将字典Counter生成转换为您请求的列表矩阵/列表

  • @ahrf:是的.您可以使用`.items()`代替.(并且`range`而不是`xrange`,当然要修复`print`s.) (2认同)