如何实现multiarray.correlate2(a,v,mode)?

blu*_*xel 7 python numpy scipy

在我理解Numpy.correlate()函数实际如何工作的路上,我在纯Python中实现它,但我看到的是非常令人失望的:

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)
Run Code Online (Sandbox Code Playgroud)

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

cel*_*cel 7

与其他语言(如c)相比,python代码的速度可能非常低.numpy旨在为数组提供高性能的操作,因此开发人员决定在其中实现一些操作c.

不幸的是,不会发现的Python实现correlatenumpy的代码基础,但如果你熟悉Cpython的扩展模块,你可以找到相关的代码在这里.

不同的模式只指定输出数组的长度.您可以通过转换输入来模拟它们:

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

收益:

array([ 0.5,  2. ,  3.5,  3. ,  0. ])
Run Code Online (Sandbox Code Playgroud)

填写v零可以得到相同的结果:

np.correlate(a, [0, 0] + v + [0, 0])
Run Code Online (Sandbox Code Playgroud)

返回相同的结果:

array([ 0.5,  2. ,  3.5,  3. ,  0. ])
Run Code Online (Sandbox Code Playgroud)

  • @bluevoxel,你明白`mode = valid`是如何工作的吗?其他两种模式只指定输出数组的长度.您可以计算任意数组大小的"互相关".每当公式试图访问无效索引(例如`v [-1]`)时,您只需假设在此位置找到了"0".通过从右侧和左侧用零填充"v"得到相同的结果,直到"len(v')== len(a)+ len(v)+ 1". (2认同)