Python 如何使用numpy数组计算字母序列中的位置

Python 如何使用numpy数组计算字母序列中的位置,python,python-3.x,string,numpy,for-loop,Python,Python 3.x,String,Numpy,For Loop,嗨,我有3个这样的序列 Dna = ['ACGTAT' 'AGCTAT' 'CGTCGA'] 这3个序列都由A,C,G,T组成, 每个序列由6个字母组成 所以我想做一个4,6个numpy的矩阵,每个位置的字母数 示例答案 [[2. 0. 0. 0. 2. 1.] -A [0. 2. 1. 0. 1. 0.] -C [1. 1. 1. 1. 0. 0.] -G [0. 0. 1. 2. 0. 2.]]-T 我在尝试什么 Dna = ['ACGTAT' 'AGCTAT' 'CGTCGA

嗨,我有3个这样的序列

Dna =  ['ACGTAT' 'AGCTAT' 'CGTCGA']
这3个序列都由A,C,G,T组成, 每个序列由6个字母组成 所以我想做一个4,6个numpy的矩阵,每个位置的字母数

示例答案

[[2. 0. 0. 0. 2. 1.] -A
 [0. 2. 1. 0. 1. 0.] -C
 [1. 1. 1. 1. 0. 0.] -G
 [0. 0. 1. 2. 0. 2.]]-T
我在尝试什么

Dna =  ['ACGTAT' 'AGCTAT' 'CGTCGA']
NT_OPTIONS = 'ACGT'
nt_to_index = {nt: i for i, nt in enumerate(NT_OPTIONS)}
pairs_count = np.zeros((4, 6))

for dna_seq in Dna:
    for i in range(len(dna_seq) - 1):
        pairs_count[nt_to_index[dna_seq[i]], nt_to_index[dna_seq[i + 1]]] += 1

print(pairs_count)

但这并没有给我答案。有人可以帮忙吗。

您可以使用列表理解来执行以下操作-不过可能有一种很好的numpy矢量化方法

>>> Dna = ['ACGTAT','AGCTAT','CGTCGA']
>>> np.array([[sum(1 if s[i]==c else 0 for s in Dna) for i in range(6)] for c in ['A', 'C', 'G', 'T']])
array([[2, 0, 0, 0, 2, 1],
       [1, 1, 1, 1, 0, 0],
       [0, 2, 1, 0, 1, 0],
       [0, 0, 1, 2, 0, 2]])

这是一种矢量化方法-

In [46]: search_lbl = ['A','G','C','T']

In [47]: (np.array(Dna).view('U1').reshape(len(Dna),-1,1)==search_lbl).sum(0).T
Out[47]: 
array([[2, 0, 0, 0, 2, 1],
       [0, 2, 1, 0, 1, 0],
       [1, 1, 1, 1, 0, 0],
       [0, 0, 1, 2, 0, 2]])
为了进一步提高性能,我们可以使用数字而不是字符串-

In [80]: a = np.array(Dna).view(np.uint8)[::4].reshape(len(Dna),-1)

In [81]: s = np.array(search_lbl).view(np.uint8)[::4]

In [82]: (a[...,None]==s).sum(0).T
Out[82]: 
array([[2, 0, 0, 0, 2, 1],
       [0, 2, 1, 0, 1, 0],
       [1, 1, 1, 1, 0, 0],
       [0, 0, 1, 2, 0, 2]])