如何从python中的numpy矩阵中为每个可能的列对检索唯一出现的对字母数的频率

时间:2013-03-03 15:44:10

标签: python numpy itertools

我有一个使用numpy矩阵的矩阵:

>>> print matrix
[['L' 'G' 'T' 'G' 'A' 'P' 'V' 'I']
 ['A' 'A' 'S' 'G' 'P' 'S' 'S' 'G']
 ['A' 'A' 'S' 'G' 'P' 'S' 'S' 'G']
 ['G' 'L' 'T' 'G' 'A' 'P' 'V' 'I']]

我想要的是对于每一对可能的列,检索每对列中每行字母的唯一出现次数的频率。

例如,对于第一对列,即:

[['L' 'G']
 ['A' 'A']
 ['A' 'A']
 ['G' 'L']]

我想检索列中每对字母的频率(注意:字母的顺序很重要)

  

['L''G']的频率= 1/4

     

['A''A']的频率= 2/4

     

['G''L']的频率= 1/4

计算出第一对列的这些频率后,对每个其他可能的列组合执行相同的操作。

我认为某种itertools会有助于解决这个问题,但我不知道如何...任何帮助都会非常感激

2 个答案:

答案 0 :(得分:6)

我使用itertools.combinationscollections.Counter

for i, j in itertools.combinations(range(len(s.T)), 2):
    c = s[:, [i,j]]
    counts = collections.Counter(map(tuple,c))
    print 'columns {} and {}'.format(i,j)
    for k in sorted(counts):
        print 'Frequency of {} = {}/{}'.format(k, counts[k], len(c))
    print

产生

columns 0 and 1
Frequency of ('A', 'A') = 2/4
Frequency of ('G', 'L') = 1/4
Frequency of ('L', 'G') = 1/4

columns 0 and 2
Frequency of ('A', 'S') = 2/4
Frequency of ('G', 'T') = 1/4
Frequency of ('L', 'T') = 1/4

[...]

(如果你想要两个订单,修改它以同时执行0 1和1 0列是微不足道的,我假设每个可能的列对你不是指“每个相邻的对列“)。

答案 1 :(得分:0)

如果你有多余的内存,对于你的阵列的某些大小,我猜的是很少的列和很多行,它可能会有利于做一个更加笨重的密集解决方案:

>>> rows, cols = matrix.shape
>>> matches = np.empty((rows, cols, cols, 2), dtype=str)
>>> matches[..., 0] = matrix[:, None, :]
>>> matches[..., 1] = matrix[:, :, None]
>>> matches = matches.view('S2')
>>> matches = matches.reshape((rows, cols, cols))

现在在matches[:, i, j]中,您在列ij之间拥有唯一的对,然后您可以执行以下操作:

>>> unique, idx = np.unique(matches[:, 0, 1], return_inverse=True)
>>> counts = np.bincount(idx)
>>> unique
array(['AA', 'GL', 'LG'], 
      dtype='|S2')
>>> counts
array([2, 1, 1])