0

我的问题可能听起来很生物学,但我相信任何人都可以在没有任何生物学知识的情况下回答这个问题,我真的可以使用一些帮助。

假设你有一个函数,create_offspring(mutations, genes1,genetic2),它接受一个突变列表,这些突变是一个 numpy 2d 数组的形式,有 5 行和 10 列(每组 5 个 val 是一个突变) :

    [ [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
4

1 回答 1

1

感谢评论中的澄清。10000 与 10 的工作方式不同 :)

首先,有一种更快的方法来创建一个空(或满)数组:

np.zeros(shape=(rows, cols), dtype=np.float)

然后,尝试生成一个随机数列表,同时检查每个随机数,然后从那里开始工作。

randoms = np.rand(len(genome))
half = (randoms < .5)

for val, (rand, half) in enumerate(zip(randoms, half)):
      your_code

这至少会加速随机数的生成。剩下的我还在想。

于 2014-03-17T04:42:21.220 回答