首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在矩阵上循环求矩阵切片的平均值Python

在矩阵上循环求矩阵切片的平均值Python
EN

Stack Overflow用户
提问于 2019-09-24 02:09:08
回答 1查看 107关注 0票数 0

我有一个带有浮点数(250x112)的大矩阵,如下所示:

代码语言:javascript
复制
import numpy as np
data = np.arange(1, 28001).reshape((250, 112))

计算3x3矩阵切片的平均值的优雅方法是什么,该切片遍历大矩阵并循环所有单元?同样重要的是,切片矩阵在条纹区域中成为2x3矩阵,并且在角落中分别成为2x2矩阵。

EN

回答 1

Stack Overflow用户

发布于 2019-09-24 03:58:23

正如评论中所建议的,它与信号卷积一起工作:

代码语言:javascript
复制
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结果的除数构造为:

代码语言:javascript
复制
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))的初始数组,这将导致:

代码语言:javascript
复制
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. ]])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58067956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档