Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 文本文件中模式搜索的快速算法_Python_Cross Correlation - Fatal编程技术网

Python 文本文件中模式搜索的快速算法

Python 文本文件中模式搜索的快速算法,python,cross-correlation,Python,Cross Correlation,我有一个double数组,大约200000行乘以100列,我正在寻找一个快速算法来查找包含与给定模式最相似序列的行(模式可以是10到100个元素)。我使用的是python,所以蛮力方法(下面的代码:在每行和起始列索引上循环,并计算每个点的欧几里德距离)大约需要三分钟 correlate函数可以更快地解决这个问题(在不到20秒内运行同一个数据集)。然而,它只是计算模式在整行上的滑动点积,这意味着要比较相似性,我必须首先对结果进行规范化。规范化互相关需要计算每个数据片段的标准偏差,这立即否定了使用n

我有一个double数组,大约200000行乘以100列,我正在寻找一个快速算法来查找包含与给定模式最相似序列的行(模式可以是10到100个元素)。我使用的是python,所以蛮力方法(下面的代码:在每行和起始列索引上循环,并计算每个点的欧几里德距离)大约需要三分钟

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]

如果数据位于2D Numpy数组中,则可以从中获取一个2D切片(200000行乘以len(pattern)列),然后一次计算所有行的范数。然后在for循环中将窗口向右滑动

ROWS = 200000
COLS = 100
PATLEN = 20
#random data for example's sake
a = np.random.rand(ROWS,COLS)
pattern = np.random.rand(PATLEN)

tmp = np.empty([ROWS, COLS-PATLEN])
for i in xrange(COLS-PATLEN):
    window = a[:,i:i+PATLEN]
    tmp[:,i] = np.sum((window-pattern)**2, axis=1)

result = np.sqrt(tmp)

我对numpy不太了解,所以我想提出一个想法:也许有一种更快的滑动方法来计算STDEV?我想补充一点好奇:我在我的机器上尝试了你的代码,它在7秒内运行。我建议尽量不要创建那么多的切片数组对象,但我还不知道怎么做。