У меня есть функция calc_dG, которая для любого массива, соответствующего короткой последовательности ДНК (от 3 до 15 оснований или около того), дает мне энергию связи этой последовательности. На самом деле, это просто поиск по массиву. nndG - это массив энергий связи для соседних пар оснований, и, таким образом, энергии связи могут быть вычислены с помощью nndG[4*S[:-1]+S[1:]]
при использовании числового способа обозначения последовательностей a, g, c, t -> 0,1,2,3: это означает, что массивы многих последовательностей могут быть вычислены сразу очень быстро.
Мне нужно найти для длины L каждую последовательность, которая соответствует некоторому шаблону и приводит к значению энергии связи в определенном диапазоне.
Это очень легко сделать с помощью итераторов: просто переберите все возможные входные данные массива, вычислите энергию привязки, а затем запишите массивы, которые находятся в диапазоне. Это, однако, слишком медленно при реализации в Python (для длины 15 с 4 возможными значениями для каждого элемента существует 4 ** 15 возможных массивов и т. Д. И т. Д.). Я мог бы использовать Weave или какой-то другой метод реализации этого в C, но я бы предпочел найти простое и быстрое решение на основе массива.
Например, если каждый элемент имеет одинаковые возможные значения (например, [0,1,2,3]), то создание массива L 1D массива любой возможной длины с этими значениями можно выполнить с помощью lambda x: indices(repeat([4],L)).reshape((L,-1)).transpose()
; тогда я могу просто сделать calc_dG( result )
и использовать результат [результаты, которые находятся в желаемом диапазоне], чтобы получить массивы, которые я хочу в качестве конечного результата. Это намного быстрее, чем использование итераторов Python, и, вероятно, почти так же быстро, если не быстрее, чем использование итераторов Си. К сожалению, он не работает для произвольных шаблонов, а для более длинных последовательностей не хватает памяти, так как он должен хранить каждый возможный массив в памяти перед вычислением значений.
Есть ли способ сделать все это, не прибегая к C?