正如 cmets 中所建议的,它适用于信号卷积:
from scipy import signal
kernel = np.array([[1,1,1],[1,1,1],[1,1,1]])
grad = signal.convolve2d(data, kernel, 'same')
grad = grad/9
然后将矩阵除以内核矩阵中的元素数,对于 3x3 矩阵,除以 9。它适用于越来越大的矩阵。
这里有更多理论,它对我理解卷积函数有很大帮助:machinelearninguru.com
如果您不想使用 scipy,它也仅适用于 numpy:
NumPy Example
如果角和边缘的均值只需要反映 单元格 及其邻居,则可以将 convolve2d 结果的除数构造为:
corners = (np.array([0,0,-1,-1], dtype=np.int32),np.array([0,-1,0,-1], dtype=np.int32))
edges = np.ones(data.shape, dtype=np.bool)
edges[1:-1,1:-1] = False
edges[corners] = False
divisor = np.ones(data.shape) * 9
divisor[corners] = 4
divisor[edges] = 6
grad = signal.convolve2d(data, kernel, 'same')
grad = grad / divisor
对于data = np.arange(1, (5*3)+1).reshape((5, 3)) 的初始数组,结果为:
In [35]: data
Out[35]:
array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12],
[13, 14, 15]])
In [36]: divisor
Out[36]:
array([[ 4., 6., 4.],
[ 6., 9., 6.],
[ 6., 9., 6.],
[ 6., 9., 6.],
[ 4., 6., 4.]])
In [37]: grad
Out[37]:
array([[ 3. , 3.5, 4. ],
[ 4.5, 5. , 5.5],
[ 7.5, 8. , 8.5],
[ 10.5, 11. , 11.5],
[ 12. , 12.5, 13. ]])