python - 对称数组与 NumPy 的卷积 : why is the result shifted?

标签 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

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

最佳答案

一个非常简单的替代方法是使用 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注意内核索引的不同符号。

关于python - 对称数组与 NumPy 的卷积 : why is the result shifted?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35466256/

相关文章:

python - Tensorflow 模型到 Numpy

python - 随机更改 numpy 数组值

convolution - 如何在 PyTorch conv2d 函数中使用组参数

python - meson 找到 python3 二进制文件,但找不到 python3 依赖项

python - 如何将多行传递到剪贴板?

python高级搜索库

python - Python中的线段树实现

python - 根据numpy python中的条件对二维数组进行子集化

keras - 图像+数字数据的神经网络

c++ - 使用 Intel MKL 的 3D 卷积