我有一个使用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会有助于解决这个问题,但我不知道如何...任何帮助都会非常感激
答案 0 :(得分:6)
我使用itertools.combinations
和collections.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]
中,您在列i
和j
之间拥有唯一的对,然后您可以执行以下操作:
>>> 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])