0

私の質問は生物学的に重いように聞こえるかもしれませんが、生物学の知識がなくても誰でも答えられると確信しており、本当に助けを借りることができます.

5 行 10 列の numpy 2d 配列の形式である、突然変異のリストを受け取る関数 create_offspring(mutations, ゲノム 1, ゲノム 2) があるとします (5 つの val の各セットは突然変異です)。 :

    [ [4, 3, 6 , 7, 8], [5, 2, 6 , 7, 8] ...]

この関数は、5 行 10 列の numpy 2d 配列の形式である 2 つのゲノムも受け取ります。ゲノムの各位置の値は、突然変異が発生していない場所の 5 つのゼロか、突然変異が発生したスポットの突然変異リストに対応する値で埋められています。以下は、位置 0 にまだ変異がなく、位置 1 にすでに変異があるゲノムの例です。

    [ [0, 0, 0 , 0, 0], [5, 2, 5 , 7, 8] ...]

私が達成しようとしているのは、効率的に(私は現在動作する方法を持っていますが、遅くする方法があります)numpy配列と2つの親ゲノムのランダムな組み合わせである2つのゲノムから子ゲノムを生成することです(AKA the numpyアレイ)。ランダムな組み合わせとは、子配列の各位置が、親 1 ゲノムまたは親 2 の位置 X の 5 つの値である可能性が 50% あることを意味します。たとえば、親 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 に答える