python Numpy的区别卷积和scipy信号,卷积

vshtjzan  于 2023-04-28  发布在  Python
关注(0)|答案(1)|浏览(133)

现在我有一个numpy 2D数组,并希望使用2D内核进行卷积。我试过用numpy。卷积和输出是:
ValueError:对象对于所需数组太深
尝试信号时。卷积效果很好。
那么有没有办法修复np呢?convolve??
并且是信号的结果。卷积将与np相同。卷积?
下面是我简单代码:

import numpy as np
from scipy import signal
a=np.array([[1,2,3],[4,5,6]])
b=np.array([[1,1],[1,1]])
A=np.convolve(a,b,'same')

out:ValueError: object too deep for desired array 

B=signal.convolve(a,b,'same')
Out[53]: 
array([[ 1,  3,  5],
   [ 5, 12, 16]])
31moq8wy

31moq8wy1#

numpy.convolve设计用于一维数组,并不意味着直接用于二维数组。但是,您可以使用numpy。convolve分别对2D阵列的每行和列执行卷积,这有效地导致2D卷积。

下面是一个如何使用numpy执行2D卷积的示例。卷积

import numpy as np
 # Define the 2D array and kernel
 arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
 kernel = np.array([[1, 0, 1], [0, 1, 0], [1, 0, 1]])

 # Perform convolution on each row
 conv_row = np.apply_along_axis(np.convolve, axis=1, arr=arr, v=kernel[:,0], mode='same')
 for i in range(1, kernel.shape[1]):
     conv_row += np.apply_along_axis(np.convolve, axis=1, arr=arr, v=kernel[:,i], mode='same')

 # Perform convolution on each column
 conv_col = np.apply_along_axis(np.convolve, axis=0, arr=conv_row, v=kernel[0,:], mode='same')
 for i in range(1, kernel.shape[0]):
     conv_col += np.apply_along_axis(np.convolve, axis=0, arr=conv_row, v=kernel[i,:], mode='same')

 # Output the result 
 print(conv_col)

请注意,这种方法可能不如使用scipy有效。signal.convolve2d,特别是对于较大的数组和内核,但它提供了一种仅使用numpy的替代方法。

相关问题