在复现pointnet++的时候遇到了一些问题
关于tensor切片
bl = torch.arange(data.size(0), dtype = torch.long)
tensor[bl, :, :]
tensor[:, :, :]
以上两种切片没什么区别
但作为非第一维就有区别了
一一对应要用一维数组,不要用二维
n_list = torch.randint(0, data.size(1), (data.size(0),), dtype = torch.float32) tensor[bl, n_list, :] #这样是bl的每个和n_list的每个一一对应 tensor[:, n_list, :] #这样是第一维中的每一个都取n_list里的所有第二维
以下为输出时:
只是如果某一维只有一个值时(指定某一维的某一个行/列,或者像sum一样将某一维整体变为一个数),会默认减少一维
如 (dis是一个三维张量)
例1:
print(dis[:, :, :])
print(dis[:, 1, :])
例2:
print(dis[:, :, :]) print(dis.size()) print(torch.sum(dis, -1)) print(torch.sum(dis, -1).size())
对于将二维list作为切片列表
如
bl = torch.arange(data.size(0), dtype = torch.long) print(data[bl, ret, :])
若ret是个一维list,则bl和:一样
若ret是个(data.size(0), data.size(1))的二维list,则需要用bl来一一对应