Python和Julia卷积之间的区别?

时间:2018-09-20 02:13:02

标签: python julia convolution

我正在尝试将一段代码从Python转换为Julia,并且很难理解以下卷积之间的输出差异:

Python:

conc = [10,100,1000,5,2000,200,20]
conc_filter = [1,2,3]
sp.ndimage.convolve1d(conc, conc_filter,axis=0,mode='constant')

输出:[ 120, 1230, 2305, 5010, 4215, 6420, 640]

朱莉娅:

conc = [10,100,1000,5,2000,200,20]
conc_filter = [1,2,3]
conv(conc,conc_filter)

输出:[10, 120, 1230, 2305, 5010, 4215, 6420, 640, 60]

谁能解释为什么输出长度不同?为了重新创建Python输出,我尝试提出一个逻辑公式,该公式将输入/过滤器大小与切片conv输出并获得相同结果所需的索引范围相关联。但是,我运气不太好。是否存在可以产生相同输出的Julia函数?

3 个答案:

答案 0 :(得分:1)

您正在使用什么Python转换例程?这是Python的numpy卷积:

>>> conc = [10,100,1000,5,2000,200,20]
>>> conc_filter = [1,2,3]

>>> numpy.convolve(conc, conc_filter,axis=0,mode='constant')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: convolve() got an unexpected keyword argument 'axis'

>>> numpy.convolve(conc, conc_filter)
array([  10,  120, 1230, 2305, 5010, 4215, 6420,  640,   60])

您可能需要查看Python软件包的文档,并查看如何使fft()类型的例程执行所需的操作。

答案 1 :(得分:0)

假设我正确理解了您的问题:

根据this在stackexchange上的回答,Julia示例的向量长度是正确的。

N + M-1给出9的输出向量长度,如Julia答案所示。

您确定Python代码和/或复制的输出正确吗?

答案 2 :(得分:0)

对于那些感兴趣的人,我制定了“常量”模式下使用的填充方案,并将其作为参数传递给Python卷积函数。难以找到输入/输出大小之间关系的原因是由于对称卷积滤波器和非对称卷积滤波器的左右填充方式不同。

下面的Julia代码似乎与所有经过测试的输入/输出的Python等效项匹配。

conc = [10,100,1000,5,2000,200,20]
conc_filter = [1,2,3]

n=length(conc)
m=length(conc_filter)

padleft=ceil(Int32,m/2)-1
padright=floor(Int32,m/2)

conc =append!(zeros(padleft),conc)
conc = append!(conc,zeros(padright))

out = zeros(n)
for i in 1:n
    for j in 1:m
        out[i] += conc[i+j-1]*conc_filter[m-j+1]
    end
end
out

结果:     [120、1230、2305、5010、4215、6420、640]