【问题标题】:Loop over a matrix for mean value of a matrix slice Python遍历矩阵以获取矩阵切片 Python 的平均值
【发布时间】:2020-01-23 20:23:03
【问题描述】:

我有一个像这样的带有浮点数 (250x112) 的大矩阵:

import numpy as np
data = np.arange(1, 28001).reshape((250, 112))

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

【问题讨论】:

标签: python numpy matrix scipy slice


【解决方案1】:

正如 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. ]])

【讨论】:

  • 你得到的角和边缘的平均值是否正确?
  • 不,我不知道。角落和边缘区域的平均值不正确,但由于矩阵的大小,这对我有用。边角区域的划分系数应为 4 和 6。
猜你喜欢
  • 2017-07-26
  • 2022-01-06
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 1970-01-01
  • 2013-09-29
相关资源
最近更新 更多