Python - 使用Numpy,ValueError生成随机dna序列

时间:2015-05-13 04:53:33

标签: python numpy random

我想问两个熟悉numpy的人有两个问题。我见过非常相似的问题(和答案),但没有一个使用我想使用的numpy,因为它提供了许多其他选项,我可能希望将来在该代码中使用。 我试图使用"随机"生成一系列随机核苷酸序列。在python中。因为我想要有不统一的概率,所以我决定使用numpy。但是,我收到错误消息:" ValueError:a必须是1维或整数"。

import numpy as np

def random_dna_sequence(length):
    return ''.join(np.random.choice('ACTG') for _ in range(length))

with open('dna.txt', 'w+') as txtout:
    for _ in range(10):
        dna = random_dna_sequence(100)
        txtout.write(dna)
        txtout.write("\n")

        print (dna)

我是一个完整的磨砂膏,我无法弄清楚多维度在何处或如何发挥作用。我怀疑" .join()"但我不确定,也不确定如何更换它。 我的另一个问题是如何获得非均匀概率。我试过" np.random.choice(' ACTG',p = 0.2,0.2,0.3,0.3)"但它没有用。

我希望有人可以提供帮助。提前谢谢。

问候, BERT

2 个答案:

答案 0 :(得分:6)

对于问题的第一部分,请将a作为列表传递:

def random_dna_sequence(length):
    return ''.join(np.random.choice(list('ACTG')) for _ in range(length))

或者将您的基地定义为列表或元组:

BASES = ('A', 'C', 'T', 'G')

def random_dna_sequence(length):
    return ''.join(np.random.choice(BASES) for _ in range(length))

第二部分有一个类似的解决方案:将概率作为列表或元组传递:

BASES = ('A', 'C', 'T', 'G')
P = (0.2, 0.2, 0.3, 0.3)

def random_dna_sequence(length):
    return ''.join(np.random.choice(BASES, p=P) for _ in range(length))

答案 1 :(得分:0)

就random_dna_sequence函数而言,我得到了与mhawke类似的解决方案。但是,我生成的序列与人类基因组的1号染色体一样长,用我的方法花了将近一分钟,因此我尝试了mhawke的方法来查看我是否有速度提升。相反,它花费了大约十倍的时间。因此,对于处理大序列的任何人,我建议对return语句进行以下更改:

BASES = ('A', 'C', 'G', 'T')
def random_dna_sequence(length):
    return ''.join(np.random.choice(BASES, length))

这基本上可以让numpy执行循环,它的执行效率更高。我希望这会有所帮助。