Skip to main content
 首页 » 编程设计

python之python中的多维卷积

2025年05月04日7tintown

我正在尝试将形状为 (10, 100, 100) 的 3 维值数组与形状为 (10, 100, 100) 的高斯矩阵进行卷积。当我使用卷积函数时,出现值错误。

def gaussian(x, mu, sigma): 
    g = (1./ (sigma * sqrt(2*pi))) * exp(-(x - mu)**2 / sigma**2) 
    return g 
 
gauss_I = gaussian( values, mean(values), std(values) )  
 
import numpy as np  
np.convolve( values, gauss_I) 
 
convolve(values, gauss_I) 

追溯(最近的调用最后):

文件“”,第 1 行,位于 卷积(值,高斯_I)

  File "/Users/Me/Applications/anaconda/lib/python3.5/site-packages/numpy/core/numeric.py", line 1013, in convolve 
    return multiarray.correlate(a, v[::-1], mode) 
 
ValueError: object too deep for desired array 

我也使用了 correlate 函数,但这给了我同样的错误。

请您参考如下方法:

一段时间以来,我一直遇到同样的问题。正如评论中已经提到的,函数 np.convolve 仅支持一维卷积。我发现的另一种选择是 scipy 函数 scipy.signal.fftconvolve适用于 N 维数组。

例如,我在这里测试形状为 (100,100,100) 的 3D 数组的卷积

import numpy as np 
import matplotlib.pyplot as plt 
import scipy.signal as sps 
 
# create 3D meshgrid and function cos(x+y) 
bins = np.linspace(-10,10,100) 
x, y, z = np.meshgrid(bins, bins, bins) 
cos = np.cos(x+y) 
print(cos.shape) # (100, 100, 100) 
 
# plot projection of function on x-y plane 
plt.title(r'$\cos(x+y)$') 
plt.contourf(x[:,:,0], y[:,:,0], np.sum(cos,axis=2)) 
plt.colorbar() 
plt.xlabel(r'$x$') 
plt.ylabel(r'$y$') 
plt.show() 
 
# perform convolution of function with itself 
conv = sps.fftconvolve(cos, cos, mode='same') 
 
print(conv.shape) # (100, 100, 100) 
 
# plot projection of convolution on x-y plane 
plt.title('numerical convolution') 
plt.contourf(x[:,:,0], y[:,:,0], np.sum(conv,axis=2)) 
plt.colorbar() 
plt.xlabel(r'$x$') 
plt.ylabel(r'$y$') 
plt.show() 

我得到以下图像:

希望对您有所帮助!