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

Python-使用Numpy、ValueError生成随机dna序列,python,numpy,random,Python,Numpy,Random,有两个问题我想问任何熟悉numpy的人。我见过非常相似的问题(和答案),但没有一个是我想使用的numpy,因为它提供了很多我将来可能想在代码中使用的其他选项。 我曾尝试在python中使用“random”生成一个随机核苷酸序列列表。因为我想得到非均匀概率,所以我决定改用numpy。但是,我得到了错误消息:“ValueError:a必须是一维或整数” 我是一个彻头彻尾的磨砂工,我不知道多维性在哪里或如何发挥作用。我怀疑“.join()”但我不确定,也不确定如何替换它。 我的另一个问题是如何得到非均

有两个问题我想问任何熟悉numpy的人。我见过非常相似的问题(和答案),但没有一个是我想使用的numpy,因为它提供了很多我将来可能想在代码中使用的其他选项。 我曾尝试在python中使用“random”生成一个随机核苷酸序列列表。因为我想得到非均匀概率,所以我决定改用numpy。但是,我得到了错误消息:“ValueError:a必须是一维或整数”

我是一个彻头彻尾的磨砂工,我不知道多维性在哪里或如何发挥作用。我怀疑“.join()”但我不确定,也不确定如何替换它。 我的另一个问题是如何得到非均匀概率。我试过使用“np.random.choice('ACTG',p=0.2,0.2,0.3,0.3)”,但它不起作用

我希望有人能帮忙。提前谢谢

您好,
bert

对于问题的第一部分,请将
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))
第二部分有一个类似的解决方案:将概率作为列表或元组传递:

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))

对于问题的第一部分,将
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))
第二部分有一个类似的解决方案:将概率作为列表或元组传递:

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))

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

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

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

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

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

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

效果很好!使用元组的解决方案非常优雅,根本不会使代码变得杂乱无章,并且可以轻松访问值来处理它们。谢谢!如果您可以在需要时使用任何其他字母表,为什么不使用alpabet=set('ACGT')作为该函数的输入?非常好!使用元组的解决方案非常优雅,根本不会使代码变得杂乱无章,并且可以轻松访问值来处理它们。谢谢!如果您可以在需要时使用任何其他字母表,为什么不使用alpabet=set('ACGT')作为函数的输入?