Python 将pytorch张量转换为numpy,并重新塑造形状

Python 将pytorch张量转换为numpy,并重新塑造形状,python,numpy,tensorflow,pytorch,Python,Numpy,Tensorflow,Pytorch,我有一个pytorch张量[100,1,32,32],对应于100个图像、1个通道、高度32和宽度32的批量大小。我想重塑这个张量,使其具有[32*10,32*10]维度,这样图像将表示为10x10网格,前10个图像位于第1行,依此类推。如何做到这一点 您可以使用: 我不完全理解你的问题,但我试图解决一些问题 您有一个形状张量[100,1,32,32],它表示100个形状图像[1,32,32],其中num\u channels=1,width=32,height=32 首先,由于图像只有一个通道

我有一个pytorch张量
[100,1,32,32]
,对应于100个图像、1个通道、高度32和宽度32的批量大小。我想重塑这个张量,使其具有[32*10,32*10]维度,这样图像将表示为10x10网格,前10个图像位于第1行,依此类推。如何做到这一点

您可以使用:


我不完全理解你的问题,但我试图解决一些问题

您有一个形状张量
[100,1,32,32]
,它表示100个形状图像
[1,32,32]
,其中
num\u channels=1
width=32
height=32

首先,由于图像只有一个通道,我们可以压缩通道维度

# image_tensor is of shape [100, 1, 32, 32]
image_tensor = image_tensor.squeeze(1) # [100, 32, 32]
我们可以将生成的张量组织成10行10幅图像,如您所述

image_tensor = image_tensor.reshape(10, 10, 32, 32)
现在,将结果张量转换为形状张量
[32*10,32*10]
听起来有些不对劲。但是,让我们做错事,看看我们最终会得到什么

image_tensor = image_tensor.permute(2, 0, 3, 1) # [32, 10, 32, 10]
在排列之后,我们得到一个形状的张量
[宽度,行数,高度,行数]
。最后,我们可以重塑以得到所需的张量

image_tensor = image_tensor.reshape(32*10, 32*10)

因此,最后一个张量的形状是
[宽度*num\u行,高度*num\u img\u行]
。你真的想要这个吗?我不知道如何解释由此产生的张量

更新

更高效和更短的版本。为了避免使用for循环,我们可以先排列
a

导入火炬
a=火炬。阿兰奇(9*2*2)。视图(9,1,2,2)
b=a.permute([0,1,3,2])
torch.cat(torch.split(b,3),-1).视图(6,6).t()
#张量([[0,1,4,5,8,9],
#         [ 2,  3,  6,  7, 10, 11],
#         [12, 13, 16, 17, 20, 21],
#         [14, 15, 18, 19, 22, 23],
#         [24, 25, 28, 29, 32, 33],
#         [26, 27, 30, 31, 34, 35]])
原始答案

您可以使用
torch.split
torch.cat
来实现它

导入火炬
a=火炬。阿兰奇(9*2*2)。视图(9,1,2,2)
假设我们有一个张量,它是原始张量的一个小版本。看起来

张量([[0,1],
[ 2,  3]]],
[[[ 4,  5],
[ 6,  7]]],
[[[ 8,  9],
[10, 11]]],
[[[12, 13],
[14, 15]]],
[[[16, 17],
[18, 19]]],
[[[20, 21],
[22, 23]]],
[[[24, 25],
[26, 27]]],
[[[28, 29],
[30, 31]]],
[[[32, 33],
[34, 35]]]])
每个2x2子矩阵可以看作一个图像。您要做的是将前三个图像堆叠到一行,然后将三个图像堆叠到第二行,最后三个图像堆叠到第三行。由于2x2子矩阵,“行”实际上有两个dim

three_parts=火炬分体式(a,3)
torch.cat(torch.split(三部分[0],1),尺寸=-1)
#张量([[0,1,4,5,8,9],
#          [ 2,  3,  6,  7, 10, 11]]]])
这里我们只讲第一部分

torch.cat([torch.cat(torch.split(三部分[i],1),-1)表示范围(3)]内的i,0)。视图(6,6)
#张量([[0,1,4,5,8,9],
#         [ 2,  3,  6,  7, 10, 11],
#         [12, 13, 16, 17, 20, 21],
#         [14, 15, 18, 19, 22, 23],
#         [24, 25, 28, 29, 32, 33],
#         [26, 27, 30, 31, 34, 35]])

有没有办法用重塑()来实现这一点?我不确定,
是否确保网格()按您的预期进行?您可能还需要将它与
permute()
结合起来,我认为-从您的问题来看,似乎您对
restrape()
有一个简单的解决方案?有没有一种方法可以使用restrape和permute?做什么?
make_grid()
做了你想做的吗?嗨,瓦西,我不认为@noveler想要的是最后的
image\u张量。请检查我的最新答案。
image_tensor = image_tensor.reshape(32*10, 32*10)