Python TypeError:需要浮点

Python TypeError:需要浮点,python,math,pytorch,Python,Math,Pytorch,我有一个pytorch变量: preds[4,4] Out[305]: Variable containing: -96.7809 [torch.cuda.FloatTensor of size 1 (GPU 0)] 我想做以下几件事: import math x=preds[4,4] y=maths.exp(x) z= y / (y+1) 但是当我这样做的时候: y=maths.exp(x) 我得到以下错误: math.exp(preds[4,4]) TypeError:

我有一个pytorch变量:

preds[4,4]
Out[305]: 
Variable containing:
-96.7809
[torch.cuda.FloatTensor of size 1 (GPU 0)]
我想做以下几件事:

 import math
 x=preds[4,4]
 y=maths.exp(x)
 z= y / (y+1)
但是当我这样做的时候:

y=maths.exp(x)
我得到以下错误:

   math.exp(preds[4,4])
TypeError: a float is required
我如何将torch变量转换为浮点,以便能够执行这些操作


感谢

索引
变量
对象不会将其转换为标量。它仍然是一个
变量
对象。但是,索引
numpy数组
会执行此操作。因此,将
变量
对象转换为一个numpy,然后按照您希望的方式对其进行索引应该可以达到目的

但是,将
变量
转换为numpy时,存在一些小缺陷

如果
preds
是存储在cpu内存中的
变量
,则可以简单地执行此操作

nparr = preds.data.numpy()
x = nparr[4, 4] 
但是,如果
preds
位于gpu内存中,则必须先将
变量
传输到cpu内存中,然后再将其转换为numpy对象,如下所示:

preds = preds.cpu()
然后按照上面的步骤做

nparr = preds.data.numpy()
x = nparr[4, 4]
在这两种情况下,
x
都是标量(在您的例子中是浮点),您可以在选择的任何数学运算中使用它

编辑: 是的,@mexmex是正确的,您还可以直接索引
变量中包装的
张量
,以提取任何给定索引处的标量值

像这样:

 x = preds.data[4, 4]

变量
对象编制索引不会将其转换为标量。它仍然是一个
变量
对象。但是,索引
numpy数组
会执行此操作。因此,将
变量
对象转换为一个numpy,然后按照您希望的方式对其进行索引应该可以达到目的

但是,将
变量
转换为numpy时,存在一些小缺陷

如果
preds
是存储在cpu内存中的
变量
,则可以简单地执行此操作

nparr = preds.data.numpy()
x = nparr[4, 4] 
但是,如果
preds
位于gpu内存中,则必须先将
变量
传输到cpu内存中,然后再将其转换为numpy对象,如下所示:

preds = preds.cpu()
然后按照上面的步骤做

nparr = preds.data.numpy()
x = nparr[4, 4]
在这两种情况下,
x
都是标量(在您的例子中是浮点),您可以在选择的任何数学运算中使用它

编辑: 是的,@mexmex是正确的,您还可以直接索引
变量中包装的
张量
,以提取任何给定索引处的标量值

像这样:

 x = preds.data[4, 4]

如果直接对数据张量进行索引,那么实际上不能省去numpy转换吗?preds.data[4,4]返回一个标量。如果您直接为数据张量编制索引,那么您实际上不能省去numpy转换吗?preds.data[4,4]返回一个标量。