Python 如何使用numpy数组计算字母序列中的位置
嗨,我有3个这样的序列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
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]])