如何从torch或numpy计算向量创建PyTorch Tensor?
解决PyTorch中用计算向量组装张量的ValueError问题
我来帮你搞定这个问题!你遇到的ValueError: only one element tensors can be converted to Python scalars,本质原因是torch.Tensor()构造函数没办法直接把PyTorch张量对象当成列表元素解析——它只认Python标量、普通数字列表或者numpy数组这类"基础"数据。你的那些尝试里,不管是把torch.cos(X)直接丢进列表,还是转numpy时没处理好张量到numpy的转换,都踩了这个坑。
下面给你两种最直接的正确写法:
方法一:用PyTorch原生的torch.stack()堆叠张量
这是最推荐的方式,全程用PyTorch操作,不用转numpy,效率更高:
import torch X = torch.arange(0,6.28) # 把cos和tan的结果沿着维度0堆叠(变成2行n列的张量) result = torch.stack([torch.cos(X), torch.tan(X)]) print(result)
运行后会得到一个2×7的张量:
tensor([[ 1.0000, 0.5403, -0.4161, -0.9899, -0.6536, 0.2837, 0.9602], [ 0.0000, 1.5574, -2.1850, -0.1425, 1.1578, -3.3805, -0.2910]])
如果想要n行2列的形状,只需要给stack指定dim=1就行:
result = torch.stack([torch.cos(X), torch.tan(X)], dim=1)
方法二:转numpy数组再构造张量
如果一定要用numpy中转,记得先把PyTorch张量转成numpy数组(用.numpy()方法),再组装成二维numpy数组,最后转成PyTorch张量:
import torch import numpy as np X = torch.arange(0,6.28) # 先把PyTorch张量转成numpy数组 cos_np = torch.cos(X).numpy() tan_np = torch.tan(X).numpy() # 组装成二维numpy数组后转张量 result = torch.tensor(np.array([cos_np, tan_np])) print(result)
这个方法的输出和方法一完全一致。
为什么你的尝试会报错?
举个例子,你写的torch.Tensor([torch.cos(X),torch.tan(x)])里,torch.cos(X)是一个7元素的PyTorch张量,torch.Tensor()会试图把这个张量当成单个元素来转换,但它只能处理单个标量张量,所以就抛出了错误。而stack函数是专门用来把多个同形状的张量合并成更高维张量的,正好匹配你的需求。
内容的提问来源于stack exchange,提问作者WestCoastProjects
相关产品推荐
相关产品推荐

