能否在PyTorch张量中通过引用方式删除元素?
PyTorch张量删除元素能否保持原内存地址?
核心结论
不行。PyTorch张量底层是连续内存块的数组实现,而非链表结构。数组要求元素在内存中连续存储,删除中间位置元素时,后续元素必须前移填补空缺,这必然需要重新分配内存或复制数据,无法让新张量与原张量共享同一内存地址。
你试过的方法为何都会创建副本
- 方法1:
torch.cat((data[:i], data[i+1:]))
切片data[:i]和data[i+1:]本身是原张量的视图(共享内存),但torch.cat需要将这两个不连续的内存块拼接成新的连续内存块,因此必须复制数据生成新张量。 - 方法2:
data[torch.LongTensor(indices_to_keep)]
这种属于高级索引(非连续索引),PyTorch中高级索引不会返回视图,而是直接创建新张量并复制对应数据,所以内存地址必然不同。
唯一例外:删除最后一个元素
如果只是删除张量的最后一个元素,可以用连续切片data[:-1],此时返回的是原张量的视图,与原张量共享内存地址:
import torch data = torch.tensor([1, 2, 3, 4]) new_data = data[:-1] print(new_data.data_ptr() == data.data_ptr()) # 输出 True
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

