通过平均多个单元简化矩阵

Tek*_*lia 4 python arrays numpy list matrix

我有一个大的2D numpy矩阵,需要做得更小(例如:从100x100转换为10x10).

我的目标是基本上:打破的n×n矩阵为更小的m×m矩阵,平均细胞在这些MXM切片,然后构造一个新的(较小的)矩阵这些的MXM切片.

我正在考虑使用类似的东西matrix[a::b, c::d]来提取较小的矩阵,然后平均这些值,但这似乎过于复杂.有没有更好的方法来实现这一目标?

Ale*_*ley 5

您可以使用该view_as_blocks函数将数组拆分为块(在scikit-image中).

对于2D数组,这将返回一个4D数组,其中逐行排序的块:

>>> 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]]]])
Run Code Online (Sandbox Code Playgroud)

沿最后两个轴取平均值将返回一个2D数组,其中每个块的均值:

>>> ski.view_as_blocks(a, (2,2)).mean(axis=(2,3))
array([[  2.5,   4.5],
       [ 10.5,  12.5]])
Run Code Online (Sandbox Code Playgroud)

注意:view_as_blocks通过修改步幅返回数组视图(它也适用于具有两个以上维度的数组).它纯粹在NumPy中使用as_strided,因此如果您无法访问scikit-image库,则可以从此处复制代码.