如何从python中的numpy矩阵中检索每对可能的列对的唯一出现次数的频率
Posted
技术标签:
【中文标题】如何从python中的numpy矩阵中检索每对可能的列对的唯一出现次数的频率【英文标题】:How to retrieve frequencies of the number of unique occurrences of pair letters for every possible pair of columns from a numpy matrix in python 【发布时间】:2013-03-03 15:44:09 【问题描述】:我有一个使用 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 将有助于解决这个问题,但我不知道如何...任何帮助将不胜感激
【问题讨论】:
一列中的项目数是否总是偶数? 不,也可能很奇怪 您是在谈论 adjacent 对还是字面意思是“所有其他可能的列对”——即第 1 列和第 5 列、第 1 列和第 6 列、第 2 列和 4,依此类推。 我的意思是所有其他可能的列对,不仅仅是相邻的对 字母的数量是有限的吗?有多少? 【参考方案1】:我会使用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 列是微不足道的,而且我假设每对可能的列都不意味着“每个 相邻 对列”)。
【讨论】:
运行代码时会显示此错误:NameError: name 'itertools' is not defined...你知道为什么吗? 啊,对不起。s
是矩阵,s.T
是它的转置。我本可以改用range(s.shape[1])
。
@ÀngelBa: itertools
和 collections
是模块,例如 numpy
。您需要导入它们。在代码前添加import itertools, collections
。
谢谢@DSM 还有一个问题.. 我忘了问另外两个参数,列中两个字母(例如 A 和 B)的单独频率......终于有了这个: freq(A,B)/(freq(A)*freq(B))... 也许我应该在另一个问题中问这个【参考方案2】:
如果您有多余的内存,对于某些大小的数组,我猜想几列多行,做一个更密集的 numpy 解决方案可能会有所回报:
>>> 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])
【讨论】:
以上是关于如何从python中的numpy矩阵中检索每对可能的列对的唯一出现次数的频率的主要内容,如果未能解决你的问题,请参考以下文章