pytorch:tensor维度理解及合并操作

pytorch:tensor维度理解及合并操作

这是我在做cnn时需要做semi_suprised learning时发现的问题,我需要将两个tensor合并。
例如

import torch as t
import numpy as np
a=t.tensor([[2,3,4],[3,4,5]])
b=t.tensor([1,2,3])
print(a)
print(b)

需要将a、b合并,得到

c=t.tensor([[2,3,4],[3,4,5],[1,2,3]])

问题十分简单,大佬跳过。
只需要:

c=t.cat((a,b),dim=0)

但是实际运行起来却报错维度不一致

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-6-b2f12a333b67> in <module>
----> 1 c=t.cat((a,b),dim=0)

RuntimeError: torch.cat(): Tensors must have same number of dimensions: got 2 and 1

但是使用c=c=torch.cat((a,a),dim=0)却可以
然后我打印了

print(a.shape)
print(b.shape)
##结果
torch.Size([2, 3])
torch.Size([3])

发现了问题,虽然看似形式一样,a确是两维,b是一维。
那怎么办呢?用reshape!
b=b.resahpe(1,3)
再用c=torch.cat((a,b),dim=0)就行了

b=b.reshape(1,3)
c=t.cat((a,b),dim=0)
c
##结果
tensor([[2, 3, 4],
        [3, 4, 5],
        [1, 2, 3]])

所以看似两次b的形式基本一样,维度却差了一维。
之后我又发现

e=b[0]
print(e)
print(e.shape)
##结果
tensor(1)
torch.Size([])

看到没有!没有维度
但是

e=e.reshape(1)
print(e)
print(e.shape)
##out
tensor([1])
torch.Size([1])

看到没有多了一个[],这又印证了我前面的叙述。
故大家合并时需要注意。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要取出PyTorch张量中不为0的值,并将它们合并到一个新的张量中,可以按照以下步骤进行: 1. 导入PyTorch库:首先需要导入PyTorch库,以便使用其中的函数和类。 2. 创建张量:可以使用torch.Tensor()函数创建一个张量,也可以根据实际需求选择其他合适的张量创建方式。 3. 获取不为0的元素:使用张量的非零索引函数(如nonzero())可以获取张量中所有不为0的元素的索引。例如,若张量名为"tensor",则可以通过tensor.nonzero()获取不为0的元素索引。 4. 提取不为0的值:通过索引将不为0的值从原始张量中提取出来。例如,可以使用tensor[indices]将不为0的值提取出来,其中indices是通过nonzero()函数获取的不为0元素的索引。 5. 合并提取的值:将提取的不为0的值使用torch.cat()函数进行合并。可以使用torch.cat(tensor_list, dim)来将多个张量在指定维度上进行合并。其中,tensor_list是一个张量的列表,dim是要在哪个维度上进行合并。 具体代码如下所示: ```python import torch # 创建张量 tensor = torch.tensor([[1, 0, 3], [0, 5, 0], [7, 0, 9]]) # 获取不为0的元素索引 nonzero_indices = tensor.nonzero() # 提取不为0的值 nonzero_values = tensor[nonzero_indices] # 合并提取的值 merged_tensor = torch.cat(nonzero_values, dim=0) print(merged_tensor) ``` 这样就可以获取并合并原始张量中的所有不为0的值到一个新的张量中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值