我有一个numpy数组大小image_stack 64x28x28x3,它对应于64个大小为28x28x3的图像。我想要的是构建一个大小为224x224x3的图像,它将包含我在初始数组中的所有图像。怎么能在numpy中这样做?到目前为止,我有在同一行中堆叠图像的代码,但我想要8行8列代替。到目前为止我的代码:
def tile_images(image_stack):
"""Given a stacked tensor of images, reshapes them into a horizontal tiling for display."""
assert len(image_stack.shape) == 4
image_list = [image_stack[i, :, :, :] for i in range(image_stack.shape[0])]
tiled_images = np.concatenate(image_list, axis=1)
return tiled_images
答案 0 :(得分:1)
以下重塑,转置,重塑技巧是否有效?
x.shape # (64, 28, 28, 3)
mosaic = x.reshape(8, 8, 28, 28, 3).transpose((0, 2, 1, 3, 4)).reshape(224, 224, 3)
第一次重塑将你的64分为行和列。 Transpose重新排列它们的顺序,以便我们可以以有意义的方式将它们折叠起来。
您的功能将如下所示:
def tile_images(x):
dims = x.shape
assert len(dims) == 4
stack_dim = int(np.sqrt(dims[0]))
res = x.reshape(stack_dim, stack_dim, *dims[1:]).transpose((0, 2, 1, 3, 4))
tile_size = res.shape[0] * res.shape[1]
return res.reshape(tile_size, tile_size, -1)