NumPy采用技巧从较大的3D立方体阵列中获取非重叠的3D立方体

时间:2018-01-24 18:46:24

标签: python arrays numpy

如何使用numpy步幅技巧从较大的3D阵列中获取非重叠,大小相等的3D数据块?我想取一个形状(256, 256, 256)的数组并将其重新整形为(8, 128, 128, 128),其中第一个轴中的每个子数组都是来自较大数组的立方体。换句话说,我想堆叠8个相等大小,不重叠的立方体,这些立方体构成第一个轴中的较大立方体。简单地将数组重新整形为这种新形状不会产生这种结果。

我能够通过Scikit-Image的实现(skimage.util.view_as_blocks)和随后的重塑来实现这一目标。请参阅下面的代码。请注意,重塑会生成数组的副本。

是否有可能通过跨步而不重塑来实现这一目标?

import numpy as np

# Create a 3D (cube) array with each side length 256.
len_ = 256
foo = np.arange(len_**3).reshape((len_, len_, len_))
foo = np.ascontiguousarray(foo)

# View blocks of shape (128, 128, 128).
block_shape = (len_ // 2,) * 3

# Bits taken from `skimage.utils.view_as_blocks`
new_shape = tuple(foo.shape // np.array(block_shape)) + block_shape
new_strides = tuple(foo.strides * np.array(block_shape)) + foo.strides
blocks =  np.lib.stride_tricks.as_strided(foo, shape=new_shape, strides=new_strides)
print("shape", blocks.shape)
print("strides", blocks.strides)
# shape (2, 2, 2, 128, 128, 128)
# strides (67108864, 262144, 1024, 524288, 2048, 8)

blocks_reshaped = blocks.reshape((-1, *block_shape))
print("shape", blocks_reshaped.shape)
print("strides", blocks_reshaped.strides)

# shape (8, 128, 128, 128)
# strides (16777216, 131072, 1024, 8)

blocks_reshaped.base is blocks  # False

0 个答案:

没有答案