2014-12-13 148 views
6

在我去了解Numpy.correlate()函数实际上是如何工作的,我得到它的实现在纯Python,但我所看到的是非常令人失望:multiarray.correlate2(a,v,mode)是如何实际执行的?

def correlate(a, v, mode='valid', old_behavior=False): 
    mode = _mode_from_name(mode) 
    if old_behavior: 
     warnings.warn("""Warning.""", DeprecationWarning) 
     return multiarray.correlate(a, v, mode) 
    else: 
     return multiarray.correlate2(a, v, mode) 

于是我开始寻找实现multiarray.correlate2(a, v, mode)功能,但不幸的是我找不到它。我只是说,我正在寻找它,因为我试图自己实现自相关函数,而且我错过了mode='full'参数中的mode='full'参数的功能,它使得函数将结果作为一维数组返回。感谢您提前帮助。

回答

7

与c等其他语言相比,Python代码的速度可能非常差。 numpy旨在提供对阵列的高性能操作,因此开发人员决定在c中实施一些操作。

不幸的是,不会找到numpy Python实现的correlate的代码基础,但如果你熟悉Cpython的扩展模块,你可以找到相关的代码here

不同的模式只是指定输出数组的长度。

import numpy as np 
a = [1, 2, 3] 
v = [0, 1, 0.5] 
np.correlate(a, v, mode="full") 

回报: 您可以将您的输入,模拟他们

np.correlate(a, [0, 0] + v + [0, 0]) 

返回相同的结果:

array([ 0.5, 2. , 3.5, 3. , 0. ]) 

您可以用零填充v得到相同的结果:

array([ 0.5, 2. , 3.5, 3. , 0. ]) 
+0

谢谢。另外,你能解释'correlate2()'函数是如何工作的,因此它给出了'mode ='full''一个数组? – bluevoxel 2014-12-13 22:51:08

+2

@bluevoxel,你知道'mode = valid'是如何工作的吗?其他两种模式只是指定输出数组的长度。你可以计算任意数组大小的“互相关”。只要公式试图访问无效索引(例如'v [-1]'),你就假设在这个位置你找到了一个'0'。通过从右侧和左侧向零填充'v',直到len(v')== len(a)+ len(v)+ 1',你得到相同的结果。 – cel 2014-12-14 07:54:17