将 4x4x3 矩阵拆分为 4 个单独的 2x2x3 矩阵

Split 4x4x3 matrix into 4 individual 2x2x3 matrixes

我想将 3d 矩阵拆分为大小相等的较小矩阵。在这种情况下,一个 4x4x3 矩阵分成 4 个 2x2x3 的单独矩阵。我正在尝试这个:

import numpy as np
from skimage.util.shape import view_as_windows

#create 4x4
data = np.array([[1,2,3,4], 
                  [5,6,7,8], 
                  [9,10,11,12], 
                  [13,14,15,16]])

#make 3 dimensional
stacked = np.dstack([data, data, data])

#split it
windows = view_as_windows(stacked, (2,2,3))

但是 windows.shape returns (3, 3, 1, 2, 2, 3) 当我期待更像 (4, 2, 2, 3) 的东西时,甚至是长度为 4 且 [=15= 的矩阵列表] 我不需要使用 skimage 来做到这一点,numpy 也可以。

如果这是 data 和输入 (4,4) 的二维问题,我希望输出是 4 个矩阵:

[[1,2,
  5,6]]

[[3,4,
  7,8]]

[[9,10,
  13,14]]

[[11,12,
  15,16]]

view_as_windows returns 重叠 window 视图到同一个数组中。您的数组有 3x3 这样的 windows,从 (row, col) 坐标 (0, 0), (0, 1), (0, 2), (1, 0), (1, 1), ( 1、2)、(2、0)、(2、1)和(2、2)。您似乎想要 nonoverlapping windows,scikit-image 调用 view_as_blocks:

import numpy as np
from skimage.util import view_as_blocks

matrix = np.random.random((4, 4, 3))
blocked = view_as_blocks(matrix, (2, 2, 3))
print(blocked.shape)

这将打印:

(2, 2, 1, 2, 2, 3)

您的四个 (2, 2, 3) 矩阵位于坐标 (0, 0, 0)、(0, 1, 0)、(1, 0, 0) 和 (1, 1, 0)在上面的数组中。沿最终轴仍然有一个阻塞维度,即使该轴上只有一个块。

你可以得到一个只有四个的线性数组:

linearized = blocked.reshape((4, 2, 2, 3))