Python - 使用 Numpy、ValueError 生成随机 dna 序列
Python - Generating random dna sequences with Numpy, ValueError
有两个问题我想问任何熟悉 numpy 的人。我见过非常相似的问题(和答案),但是 none 我想使用 numpy,因为它提供了很多我将来可能想在该代码中使用的其他选项。
我尝试使用 python 中的 "random" 生成随机核苷酸序列列表。因为我想要非均匀概率,所以我决定改用 numpy。但是,我收到错误消息:"ValueError: a must be 1-dimensional or an integer".
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)" 但它不起作用。
我希望有人可以提供帮助。提前致谢。
问候,
伯特
对于问题的第一部分,将 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))
就 random_dna_sequence 函数而言,我得到了与 mhawke 类似的解决方案。然而,我正在生成一个与人类基因组 1 号染色体一样长的序列,而我的方法几乎花了一分钟,所以我尝试了 mhawke 的方法,看看我是否有任何速度增益。相反,它花费了大约 10 倍的时间。因此,对于处理大型序列的任何人,我建议对 return 语句进行以下更改:
BASES = ('A', 'C', 'G', 'T')
def random_dna_sequence(length):
return ''.join(np.random.choice(BASES, length))
这基本上让 numpy 执行循环,它的效率更高。希望对您有所帮助。
有两个问题我想问任何熟悉 numpy 的人。我见过非常相似的问题(和答案),但是 none 我想使用 numpy,因为它提供了很多我将来可能想在该代码中使用的其他选项。 我尝试使用 python 中的 "random" 生成随机核苷酸序列列表。因为我想要非均匀概率,所以我决定改用 numpy。但是,我收到错误消息:"ValueError: a must be 1-dimensional or an integer".
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)" 但它不起作用。
我希望有人可以提供帮助。提前致谢。
问候, 伯特
对于问题的第一部分,将 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))
就 random_dna_sequence 函数而言,我得到了与 mhawke 类似的解决方案。然而,我正在生成一个与人类基因组 1 号染色体一样长的序列,而我的方法几乎花了一分钟,所以我尝试了 mhawke 的方法,看看我是否有任何速度增益。相反,它花费了大约 10 倍的时间。因此,对于处理大型序列的任何人,我建议对 return 语句进行以下更改:
BASES = ('A', 'C', 'G', 'T')
def random_dna_sequence(length):
return ''.join(np.random.choice(BASES, length))
这基本上让 numpy 执行循环,它的效率更高。希望对您有所帮助。