我有两个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()
如何获得未移位的卷积数组?
答案 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为中心,但我确保array1
和array2
以0为中心。从您的情节我想-22<x<27
(不集中)
我推荐scipy
的原因是因为我也有类似的问题:-)他们只是使用不同的定义:numpy和scipy注意到内核索引的不同符号
答案 1 :(得分:0)
我担心这是一个关于卷积的数学问题,我无法回答。但是,如果您只是希望将卷积数组置于零(最小值)中心,则以下内容将提供快速修复&#39;:
plt.plot(x + x[np.argmin(conv_array[:conv_array.shape[0]*3/4)]],conv_array)