将numpy 3-d数组拆分为较小的3-d数组的2-d数组

时间:2020-04-23 18:57:10

标签: python arrays numpy

我目前有3通道(RGB)的图像作为numpy数组。我想将其有效地分成较小的3-d子阵列的2-d阵列。例如,如果我的图像的形状为(100,100,3),我想将其转换为10 x 10数组,其中元素为(10,10,3)图像(子图像),同时保持空间方向。图像的高度和宽度将始终相等。

我也希望撤销整个操作。

如果这很难做,是否有一种方法可以在元素仍然相同的情况下按行或列顺序将其转换为4-d数组?

是否有使用numpy方法执行此操作的有效方法?

1 个答案:

答案 0 :(得分:0)

您可以使用步幅拆分数组:

image = np.arange(30000).reshape(100,100,3)

sub_shape = (10,10,3)

#divide the matrix into sub_matrices of subshape
view_shape = tuple(np.subtract(image.shape, sub_shape) + 1) + sub_shape
strides = image.strides + image.strides
sub_matrices = np.squeeze(np.lib.stride_tricks.as_strided(image,view_shape,strides)[::sub_shape[0],::sub_shape[1],:])

sub_matrices形状:

(10, 10, 10, 10, 3)

sub_matrices[i,j,:,:,:]是第[i,j]个子数组。

或者,您可以重塑图像:

sub_shape = (10,10,3)
sub_matrices = np.swapaxes(image.reshape(image.shape[0]/sub_shape[0],sub_shape[0],image.shape[1]/sub_shape[1],sub_shape[1],image.shape[3]), 1, 2)

同样,sub_matrices[i,j,:,:,:]是第[i,j]个子数组。