我有一个带有浮点数(250x112)的大矩阵,如下所示:
import numpy as np
data = np.arange(1, 28001).reshape((250, 112))计算3x3矩阵切片的平均值的优雅方法是什么,该切片遍历大矩阵并循环所有单元?同样重要的是,切片矩阵在条纹区域中成为2x3矩阵,并且在角落中分别成为2x2矩阵。
发布于 2019-09-24 03:58:23
正如评论中所建议的,它与信号卷积一起工作:
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. ]])https://stackoverflow.com/questions/58067956
复制相似问题