Быстрый алгоритм поиска шаблона в текстовом файле

У меня есть массив двойников, примерно 200 000 строк на 100 столбцов, и я ищу быстрый алгоритм для поиска строк, содержащих последовательности, наиболее похожие на данный шаблон (шаблон может может быть от 10 до 100 элементов.) Я использую python, поэтому метод грубой силы (код ниже: цикл по каждой строке и индексу начального столбца и вычисление евклидова расстояния в каждой точке) занимает около трех минут.

Функция numpy.correlate обещает решить эту проблему намного быстрее (работает с тем же набором данных менее чем за 20 секунд). . Однако он просто вычисляет скользящее точечное произведение шаблона по всей строке, а это означает, что для сравнения сходства мне сначала нужно нормализовать результаты. Нормализация взаимной корреляции требует вычисления стандартного отклонения каждого фрагмента данных, что в первую очередь сводит на нет улучшение скорости использования numpy.correlate.

Можно ли быстро вычислить нормализованную взаимную корреляцию в Python? Или мне придется прибегнуть к кодированию метода грубой силы на C?

def norm_corr(x,y,mode='valid'):
    ya=np.array(y)
    slices=[x[pos:pos+len(y)] for pos in range(len(x)-len(y)+1)]
    return [np.linalg.norm(np.array(z)-ya) for z in slices]

similarities=[norm_corr(arr,pointarray) for arr in arraytable]
10
задан sbrother 6 February 2012 в 16:59
поделиться