通过更大的矩阵迭代子矩阵

时间:2017-03-15 14:41:20

标签: python loops numpy matrix

我在寻找一种方法,我使用for循环可以迭代更大的矩阵,其中每次迭代将输出一个大小的子矩阵(行,列,深度)(6,3,3)。

我的大矩阵存储为numpy矩阵,也可能像每次迭代一样输出。

>>> import numpy as np
>>> a = np.random.rand(6*3,3*3,3)
>>> print a.shape
(18, 9, 3)
>>> print a
>>> b

变量b应包含矩阵a中所有大小为(6,3,3)的子矩阵。 每个子矩阵不应与先前的子矩阵重叠。

enter image description here

1 个答案:

答案 0 :(得分:2)

方法#1

我假设我们正在寻找non-overlapping / distinct块。因此,我们可以使用Scikit-image's view_as_blocks实用程序 -

from skimage.util.shape import view_as_blocks

BSZ = (6,3,3)
out = view_as_blocks(a,BSZ).reshape((-1,)+ (BSZ))

示例运行 -

In [279]: a = np.random.rand(6*3,3*3,3)

In [280]: out = view_as_blocks(a,BSZ).reshape((-1,)+ (BSZ))

In [281]: out.shape
Out[281]: (9, 6, 3, 3)

方法#2

仅使用reshapingtranspose等原生NumPy工具,这是一种方法 -

m,n,r = a.shape
split_shp = m//BSZ[0], BSZ[0], n//BSZ[1], BSZ[1], r//BSZ[2], BSZ[2]
out = a.reshape(split_shp).transpose(0,2,4,1,3,5).reshape((-1,)+ (BSZ))