2014-03-17 3 views
0

Мой вопрос может звучать биологически тяжело, но я уверен, что любой мог бы ответить на него без каких-либо знаний в области биологии, и я действительно мог бы использовать некоторую помощь.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 
+0

Вы уверены, что это медленная часть? Как медленно идет медленно? Как быстро вам нужно бежать? –

+0

Да, я уверен. Из-за того, что вопрос стал менее запутанным, я сказал, что массив имеет всего 10 мутаций, но на самом деле я работаю с геномами размером> 10000, и после того, как все в моем коде все это замедляет, большинство из них. Он должен иметь возможность запускать функцию ~ 20000000 раз в течение дня или около того. Если бы вы могли помочь мне разобраться, как это ускорить, это было бы потрясающе. – zlawrence

ответ

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 

Это, по крайней мере, ускорит генерацию случайных чисел. Я все еще думаю об остальном.

+0

ага, удивительный. Дайте мне знать, если вам нужно больше разъяснений, поскольку я понимаю, что во всех разговорах по биологии я мог пропустить что-то важное. – zlawrence

Смежные вопросы