最近在改一些小demo,让自己在假期之后也不会对相关编程语言过于生疏。今天在修改yolov5的过程中,我注意到了一些我之前没有注意到的点。那便是关于pytorch张量的拷贝到底哪些算是浅拷贝哪些是深拷贝的问题。进一步,我观察一些之前写的数据处理程序,发现不仅是pytorch的拷贝机制和以往不同,numpy的张量拷贝机制也同样和一般情况下是不一样的,接下来进行简要的介绍。
所谓浅拷贝,为共享内存机制,两个变量都指向同一块地址
import torch
a = torch.tensor([1])
b = a
a *= 10
print(a, b)
结果
tensor([10]) tensor([10])
b = a[:]
a *= 10
结果
tensor([10]) tensor([10])
view()
b = a.view(-1)
a *= 10
结果
tensor([10]) tensor([10])
reshape()
b = a.reshape(-1)
a *= 10
结果
tensor([10]) tensor([10])
flatten(input, dim)
b = torch.flatten(a, 0)
a *= 10
结果
tensor([10]) tensor([10])
expand(),expand_as()
b = a.expand((1,2))
a *= 10
结果
tensor([10]) tensor([[10, 10]])
numpy()
b = a.numpy()
a *= 10
结果
tensor([10]) [10]
from_numpy()
a = np.array([1])
b = torch.from_numpy(a)
b *= 10
结果
[10] tensor([10], dtype=torch.int32)
as_tensor()
def ppp(a):
print(a)
b = a
b *= 10
print(a, b)
if __name__=='__main__':
a = torch.tensor([1])
ppp(a)
print(a)
结果
tensor([1])
tensor([10]) tensor([10])
tensor([10])
a = torch.tensor([1])
b = a.clone()
a *= 10
结果
tensor([10]) tensor([1])
a = torch.tensor([1])
b = torch.zeros_like(a)
torch.Tensor.copy_(b, a)
a *= 10
结果
tensor([10]) tensor([1])
stack()
a = torch.tensor([1])
c = torch.zeros_like(a)
b = torch.stack((a, c), 1)
a *= 10
结果
tensor([10]) tensor([[1, 0]])
cat()
a = torch.tensor([1])
c = torch.zeros_like(a)
b = torch.cat((a, c), 1)
a *= 10
tensor([10]) tensor([1, 0])
a = torch.tensor([1])
b = a * 1
b *= 10
结果
tensor([1]) tensor([10])
ones_like()
zeros_like()
a = np.array([1])
b = a
b *= 10
结果
[10] [10]
def ppp(a):
print(a)
b = a
b *= 10
print(a, b)
if __name__=='__main__':
a = np.array([1])
ppp(a)
print(a)
结果
[1]
[10] [10]
[10]
a = np.array([1])
b = a.copy()
b *= 10
结果
[1] [10]
a = np.array([1])
b = a+1
b *= 10
结果
[1] [20]
以上便是笔者目前所总结的,numpy()部分并不是很多,如有错误欢迎大家指正与补充!!!!