【发布时间】:2014-03-17 04:15:28
【问题描述】:
我的问题可能听起来很生物学,但我相信任何人都可以在没有任何生物学知识的情况下回答这个问题,而且我真的需要一些帮助。
假设你有一个函数,create_offspring(mutations, genes1,genetic2),它接受一个突变列表,这些突变是一个 numpy 2d 数组的形式,有 5 行和 10 列(每组 5 个 vals 是突变):
[ [4, 3, 6 , 7, 8], [5, 2, 6 , 7, 8] ...]
该函数还采用 5 行 10 列的 numpy 2d 数组形式的两个基因组。基因组中每个位置的值要么是未发生突变的位置的 5 个零,要么填充与发生突变的点的突变列表相对应的值。下面是一个基因组的示例,该基因组在 0 位尚未发生突变,而在 1 位已经发生了突变。
[ [0, 0, 0 , 0, 0], [5, 2, 5 , 7, 8] ...]
我想要完成的是有效地(我有一个当前的工作方式,但它是慢的方式)从我的两个基因组生成一个子基因组,这是一个 numpy 数组和两个父基因组的随机组合(又名 numpy 数组)。通过随机组合,我的意思是子数组中的每个位置都有 50% 的机会是来自父 1 基因组或父 2 的位置 X 的 5 个值。例如,如果父 1 是
[0,0,0,0,0], [5, 2, 6 , 7, 8] ...]
父母 2 是
[ [4, 3, 6 , 7, 8], [0, 0, 0 , 0, 0] ...]
子基因组应该有 50% 的机会在位置 1 获得全零,并有 50% 的机会获得[4, 3, 6 , 7, 8] 等。
此外,子基因组需要有 0.01% 的机会从一开始传入的突变列表中获得相应的突变。
我有一个当前的方法来解决这个问题,但它需要的时间太长了:
def create_offspring(mutations, genome_1, genome_2 ):
##creates an empty genome
child_genome = numpy.array([[0]*5] * 10, dtype=np.float)
for val in range(10):
random = rand()
if random < mutation_rate:
child_genome[val] = mutation_list[val]
elif random > .5:
child_genome[val] = genome1[val]
else:
child_genome[val] = genome2[val]
return child_genome
【问题讨论】:
-
你确定这是慢的部分吗?慢有多慢?您需要它运行多快?
-
是的,我很确定。为了让这个问题不那么令人困惑,我说这个数组只有 10 个突变长,但实际上我正在处理大小大于 10000 的基因组,并且在我的代码中对所有内容进行计时之后,这部分会减慢它的速度。它需要能够在一天左右的时间内运行该功能〜20000000次。如果你能帮我弄清楚如何加快速度,那就太棒了。
标签: python arrays performance genetics