如何将 pytorch 整数张量转换为布尔张量?

     2023-02-16     166

关键词:

【中文标题】如何将 pytorch 整数张量转换为布尔张量?【英文标题】:How to convert a pytorch tensor of ints to a tensor of booleans? 【发布时间】:2019-05-02 21:32:15 【问题描述】:

我想将整数张量转换为布尔张量。

具体来说,我希望能够拥有一个将tensor([0,10,0,16]) 转换为tensor([0,1,0,1]) 的函数

这在 Tensorflow 中很简单,只需使用 tf.cast(x,tf.bool)

我希望强制转换将所有大于 0 的整数更改为 1,并将所有等于 0 的整数更改为 0。这相当于大多数语言中的 !!

由于 pytorch 似乎没有专用的布尔类型可以转换,所以这里最好的方法是什么?

编辑:我正在寻找一种矢量化解决方案,而不是循环遍历每个元素。

【问题讨论】:

在每个元素上调用 bool(int)。或者在 numpy 中:使用 array.astype(...) 这是需要for循环的简单解决方案,是的。但是有矢量化的解决方案吗? astype 版本几乎肯定是矢量化的。 @ThomasLang 在 pytorch 中没有 .astype,所以必须要 convert to numpy-> cast -> load to pytorch 哪个 IMO 效率低下 【参考方案1】:

您可以使用如下所示的比较:

 >>> a = tensor([0,10,0,16])
 >>> result = (a == 0)
 >>> result
 tensor([ True, False,  True, False])

【讨论】:

【参考方案2】:

您正在寻找的是为给定的整数张量生成一个布尔掩码。为此,您可以使用简单的比较运算符 (>) 或使用 torch.gt() 来简单地检查条件:“张量中的值是否大于 0”,这将为我们提供所需的结果。

# input tensor
In [76]: t   
Out[76]: tensor([ 0, 10,  0, 16])

# generate the needed boolean mask
In [78]: t > 0      
Out[78]: tensor([0, 1, 0, 1], dtype=torch.uint8)

# sanity check
In [93]: mask = t > 0      

In [94]: mask.type()      
Out[94]: 'torch.ByteTensor'

注意:在 PyTorch 1.4+ 版本中,上述操作会返回'torch.BoolTensor'

In [9]: t > 0  
Out[9]: tensor([False,  True, False,  True])

# alternatively, use `torch.gt()` API
In [11]: torch.gt(t, 0)
Out[11]: tensor([False,  True, False,  True])

如果您确实想要单个位(0s 或 1s),请使用:

In [14]: (t > 0).type(torch.uint8)   
Out[14]: tensor([0, 1, 0, 1], dtype=torch.uint8)

# alternatively, use `torch.gt()` API
In [15]: torch.gt(t, 0).int()
Out[15]: tensor([0, 1, 0, 1], dtype=torch.int32)

此功能请求问题中讨论了此更改的原因:issues/4764 - Introduce torch.BoolTensor ...


TL;DR:简单的一个班轮

t.bool().int()

【讨论】:

这会在 PyTorch 1.4.0 中返回“torch.BoolTensor”。【参考方案3】:

将布尔值转换为数值:

a = torch.tensor([0,4,0,0,5,0.12,0.34,0,0])
print(a.gt(0)) # output in boolean dtype
# output: tensor([False,  True, False, False,  True,  True,  True, False, False])

print(a.gt(0).to(torch.float32)) # output in float32 dtype
# output: tensor([0., 1., 0., 0., 1., 1., 1., 0., 0.])

【讨论】:

【参考方案4】:

另一种选择是简单地做:

temp = torch.tensor([0,10,0,16])
temp.bool()
#Returns
tensor([False,  True, False,  True])

【讨论】:

【参考方案5】:

PyTorch 的to(dtype) 方法有方便的data-type named aliases。您可以直接拨打bool:

>>> t.bool()
tensor([False,  True, False,  True])
>>> t.bool().int()
tensor([0, 1, 0, 1], dtype=torch.int32)

【讨论】:

将 PyTorch 张量转换为 python 列表

】将PyTorch张量转换为python列表【英文标题】:ConvertPyTorchtensortopythonlist【发布时间】:2019-05-2300:33:30【问题描述】:如何将PyTorchTensor转换为python列表?我当前的用例是将大小为[1,2048,1,1]的张量转换为2048个元素的列表。我的张量... 查看详情

如何将字符串列表转换为pytorch中的张量?

】如何将字符串列表转换为pytorch中的张量?【英文标题】:Howtoconvertalistofstringsintoatensorinpytorch?【发布时间】:2017-11-2022:05:50【问题描述】:我正在研究分类问题,其中我有一个字符串列表作为类标签,我想将它们转换为张量。... 查看详情

将 Pandas 数据帧转换为 PyTorch 张量?

】将Pandas数据帧转换为PyTorch张量?【英文标题】:ConvertPandasdataframetoPyTorchtensor?【发布时间】:2018-10-2218:41:54【问题描述】:我想用PyTorch在pandas数据帧df上训练一个简单的神经网络。其中一列名为"Target",它是网络的目标... 查看详情

将 pytorch 张量保存为 32 位灰度图像

】将pytorch张量保存为32位灰度图像【英文标题】:Savingapytochtensorasa32-bitgrayscaleImage【发布时间】:2021-06-2921:34:21【问题描述】:我处理了一个32位灰度.tif图像,我使用PIL将其转换为张量。在此之后,我将其保存为:torchvision.utils.... 查看详情

PyTorch:如何将张量的形状作为 int 列表获取

】PyTorch:如何将张量的形状作为int列表获取【英文标题】:PyTorch:HowtogettheshapeofaTensorasalistofint【发布时间】:2018-03-3106:35:20【问题描述】:在numpy中,V.shape给出了一个维数为V的整数元组。在tensorflow中V.get_shape().as_list()给出了V维... 查看详情

如何将张量列表转换为 Torch::Tensor?

...btorch:tfm=np.float32([[A[0,0],A[1,0],A[2,0]],[A[0,1],A[1,1],A[2,1]]])在Pytorch中,我们可以简单 查看详情

在 PyTorch 中将 5D 张量转换为 4D 张量

】在PyTorch中将5D张量转换为4D张量【英文标题】:Convert5Dtensorto4DtensorinPyTorch【发布时间】:2020-12-2712:19:31【问题描述】:在PyTorch中,我有一个尺寸为Bx9xCxHxW的5D张量X。我想将其转换为尺寸为Bx9CxHxW的4D张量Y,以便以通道方式进行... 查看详情

如何将张量逐行乘以 PyTorch 中的向量?

】如何将张量逐行乘以PyTorch中的向量?【英文标题】:Howtomultiplyatensorrow-wisebyavectorinPyTorch?【发布时间】:2019-05-2800:18:48【问题描述】:当我有一个形状为[12,10]的张量m和一个形状为[12]的标量向量s时,如何将m的每一行与s中的相... 查看详情

Pytorch张量,如何切换通道位置 - 运行时错误

】Pytorch张量,如何切换通道位置-运行时错误【英文标题】:Pytorchtensor,howtoswitchchannelposition-Runtimeerror【发布时间】:2020-04-2603:14:20【问题描述】:我的训练数据集如下,其中X_train是具有3个通道的3DX_Train的形状:(708,256,3)Y_Train的... 查看详情

Torch JIT Trace = TracerWarning:将张量转换为 Python 布尔值可能会导致跟踪不正确

】TorchJITTrace=TracerWarning:将张量转换为Python布尔值可能会导致跟踪不正确【英文标题】:TorchJITTrace=TracerWarning:ConvertingatensortoaPythonbooleanmightcausethetracetobeincorrect【发布时间】:2021-06-1902:42:54【问题描述】:我正在关注本教程:http... 查看详情

Pytorch 张量到 numpy 数组

】Pytorch张量到numpy数组【英文标题】:Pytorchtensortonumpyarray【发布时间】:2018-09-2022:32:48【问题描述】:我有一个pytorch张量,大小为torch.Size([4,3,966,1296])我想使用以下代码将其转换为numpy数组:imgs=imgs.numpy()[:,::-1,:,:]谁能解释一下... 查看详情

Pytorch 展开和折叠:如何将这个图像张量重新组合在一起?

】Pytorch展开和折叠:如何将这个图像张量重新组合在一起?【英文标题】:PytorchUnfoldandFold:HowdoIputthisimagetensorbacktogetheragain?【发布时间】:2021-01-1021:08:00【问题描述】:我正在尝试使用展开过滤大小为256x256的单通道2D图像,以... 查看详情

使用 grad 将 PyTorch 张量调整为更小的尺寸

】使用grad将PyTorch张量调整为更小的尺寸【英文标题】:ResizingPyTorchtensorwithgradtosmallersize【发布时间】:2020-06-2502:51:20【问题描述】:我正在尝试将张量从(3,3)缩小到(1,1),但我想保留原始张量:importtorcha=torch.rand(3,3)a_copy=a.clone()a... 查看详情

如何将张量转换为 ndarray(内部带有对抗图像的张量)

】如何将张量转换为ndarray(内部带有对抗图像的张量)【英文标题】:HowtoconvertTensortondarray(tensorwithadversarialimagesinside)【发布时间】:2019-02-2520:47:51【问题描述】:注意:我已经尝试了不同SO问题的解决方案,但均未成功,详情... 查看详情

具有多个值的张量的布尔值在 Pytorch 中不明确

】具有多个值的张量的布尔值在Pytorch中不明确【英文标题】:BoolvalueofTensorwithmorethanonevalueisambiguousinPytorch【发布时间】:2019-03-2713:35:00【问题描述】:我想在pytorch中创建一个模型,但我做不到计算损失。它总是返回Tensor的布尔... 查看详情

如何调整 PyTorch 张量的大小?

】如何调整PyTorch张量的大小?【英文标题】:HowtoresizeaPyTorchtensor?【发布时间】:2020-02-2818:45:17【问题描述】:我有一个大小为(5,1,44,44)(批次、通道、高度、宽度)的PyTorch张量,我想将其“调整大小”为(5,1,224,224)我该怎么做... 查看详情

使用 str 键和 pytorch 张量列表将字典保存为值

】使用str键和pytorch张量列表将字典保存为值【英文标题】:Savingthedictionarywithstrkeysandalistofpytorchtensorsasvalues【发布时间】:2020-11-1505:44:18【问题描述】:我想保存一个字典列表,其中键是查询的索引(因此字典的键是字符串)。... 查看详情

如何在 PyTorch 中将 RGB 图像编码为 n_class One 热张量

】如何在PyTorch中将RGB图像编码为n_classOne热张量【英文标题】:HowtoencodeaRGBImagetoann_classOneHotTensorinPyTorch【发布时间】:2019-11-2807:24:52【问题描述】:所以,我正在做一个分割任务,我需要做的是将一个RGB图像转换为一个n通道一... 查看详情