我有一个大的 2D numpy 矩阵需要变小(例如:从 100x100 转换为 10x10)。
我的目标基本上是:将 nxn 矩阵分解成更小的 mxm 矩阵,对这些 mxm 切片中的单元格进行平均,然后构造一个这些 mxm 切片中的新(较小)矩阵。
我正在考虑使用类似 matrix[a::b, c::d]
的方法来提取较小的矩阵,然后对这些值进行平均,但这似乎过于复杂。有没有更好的方法来实现这一点?
最佳答案
你可以用 view_as_blocks
把你的数组分成 block 函数(在 scikit-image 中)。
对于 2D 数组,这将返回一个 4D 数组,其中 block 按行排序:
>>> import skimage.util as ski
>>> import numpy as np
>>> a = np.arange(16).reshape(4,4) # 4x4 array
>>> ski.view_as_blocks(a, (2,2))
array([[[[ 0, 1],
[ 4, 5]],
[[ 2, 3],
[ 6, 7]]],
[[[ 8, 9],
[12, 13]],
[[10, 11],
[14, 15]]]])
沿最后两个轴取平均值返回一个二维数组,其中每个 block 均值为:
>>> ski.view_as_blocks(a, (2,2)).mean(axis=(2,3))
array([[ 2.5, 4.5],
[ 10.5, 12.5]])
注意:view_as_blocks
通过修改步幅返回数组的 View (它也适用于二维以上的数组)。它纯粹是在 NumPy 中使用 as_strided
实现的,因此如果您无法访问 scikit-image 库,您可以 copy the code from here .
关于python - 通过平均多个单元格来简化矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29435842/