Мой вопрос может звучать биологически тяжело, но я уверен, что любой мог бы ответить на него без каких-либо знаний в области биологии, и я действительно мог бы использовать некоторую помощь.Python numpy эффективно объединяет массивы
Предположим, что у вас есть функция create_offspring (mutations, genome1, genome2), которая принимает список мутаций, которые представлены в виде массивов numpy 2d с 5 строками и 10 столбцами как таковыми (каждый набор из 5 vals является мутация):
[ [4, 3, 6 , 7, 8], [5, 2, 6 , 7, 8] ...]
функция также принимает два геномы, которые находятся в форме Numpy 2d массивов с 5 строк и 10 столбцов. Значение в каждой позиции в геномах - это 5 нулей в местах, где мутация не произошла, или заполнены значениями, соответствующими списку мутаций для пятен, где произошла мутация. Ниже приведен пример генома, который еще не имеет мутации в pos 0 и уже имеет мутацию в позиции 1.
[ [0, 0, 0 , 0, 0], [5, 2, 5 , 7, 8] ...]
То, что я пытаюсь сделать это эффективно (у меня есть текущий путь, который работает, но это способ замедлить) генерировать ребенок геном из моих двух геномов, что является NumPy массива и случайной комбинацией два родительских генома (AKA - массивы numpy). По случайной комбинации, я имею в виду, что каждая позиция в массиве ребенка имеет 50% шанс либо будучи 5 значений в положении Х от родительского генома или 1 родителя 2. Например, если родитель 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]
и т.д. с ..
Кроме того, там должен быть .01% вероятность того, что дочерний геном получит все, что соответствует m utation из списка мутаций, прошедшего в начале.
У меня есть текущий метод решения, но это занимает слишком много времени:
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 раз в течение дня или около того. Если бы вы могли помочь мне разобраться, как это ускорить, это было бы потрясающе. – zlawrence