如何从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.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 列是微不足道的,而且我假设每对可能的列都不意味着“每个 相邻 对列”)。

【讨论】:

运行代码时会显示此错误:NameError: name 'itertools' is not defined...你知道为什么吗? 啊,对不起。 s 是矩阵,s.T 是它的转置。我本可以改用range(s.shape[1]) @ÀngelBa: itertoolscollections 是模块,例如 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] 中,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])

【讨论】:

以上是关于如何从python中的numpy矩阵中检索每对可能的列对的唯一出现次数的频率的主要内容,如果未能解决你的问题,请参考以下文章

如何从 numpy 矩阵传递到 numpy 数组?

从numpy python中的稀疏矩阵生成密集矩阵

python如何挑选矩阵中的不相领的列组成新的矩阵

Python Numpy中的几个矩阵乘法

python如何输入矩阵

42-python中的矩阵多维数组----numpy