使用NumPy对称阵列的卷积:为什么结果会发生变化?

时间:2016-02-17 19:45:20

标签: python numpy convolution

我有两个numpy数组。每个包含一个类似于内核的函数,以零为中心,完全对称,长度均为101.当我对这些数组进行卷积时,我是否应该期望,另一个数组也以零为中心?我正在使用numpy.convolve,并且我总是得到一个不以零为中心的结果内核数组,这不是我想要的:我需要一个也完全居中,而不是移位。

我的代码或多或少是这样的:

import numpy as np
import matplotlib.pyplot as plt

x = np.array([...])        # x-axis
array1 = np.array([...])   # Blue curve
array2 = np.array([...])   # Green curve
# All arrays are one-dimensional
conv_array = np.convolve(array1, array2, mode='same') # Red curve
conv_array /= max(conv_array) # Normalization

plt.plot(x, array1)
plt.plot(x, array2)
plt.plot(x, conv_array)
plt.show()

曲线的结果图如下: Blue curve = array1, green curve = array2, red curve = convolution result

如何获得未移位的卷积数组?

2 个答案:

答案 0 :(得分:1)

一个非常简单的选择是使用scipy.ndimage.convolve1d而不是numpy.convolve

import numpy as np
import matplotlib.pyplot as plt
from astropy.modeling import models

# Create a model
x = np.arange(101) - 50       # x-axis
g1 = models.Gaussian1D(amplitude=2, mean=0, stddev=4)
g2 = models.Gaussian1D(amplitude=3, mean=0, stddev=3)
array1 = g1(x)
array2 = 1 - g2(x)

from scipy.ndimage import convolve1d

conv_array2 = convolve1d(array1, array2)
conv_array2 /= conv_array2.max()

# One can also use numpy convolve here
conv_array = np.convolve(array1, array2, mode='same') # Red curve
conv_array /= max(conv_array) # Normalization

plt.plot(x, array1)
plt.plot(x, array2)
plt.plot(x, conv_array) # Is centered on 0
plt.plot(x, conv_array2) # Is centered on 0
plt.show()

我想问题是你的数组并不完全以0为中心。(所以x[50] != 0)。 numpy在卷积之前翻转内核,因此你得到一个转变。请注意,如果您尝试我的示例,numpy.convolve结果也完全以0为中心,但我确保array1array2以0为中心。从您的情节我想-22<x<27 (不集中)

我推荐scipy的原因是因为我也有类似的问题:-)他们只是使用不同的定义:numpyscipy注意到内核索引的不同符号

答案 1 :(得分:0)

我担心这是一个关于卷积的数学问题,我无法回答。但是,如果您只是希望将卷积数组置于零(最小值)中心,则以下内容将提供快速修复&#39;:

plt.plot(x + x[np.argmin(conv_array[:conv_array.shape[0]*3/4)]],conv_array)