【发布时间】:2019-02-21 18:02:04
【问题描述】:
我正在阅读 PyTorch 的基本教程,并遇到了 NumPy 数组和 Torch 张量之间的转换。文档说:
Torch 张量和 NumPy 数组将共享它们的底层内存位置,改变一个会改变另一个。
但是,下面的代码似乎并非如此:
import numpy as np
a = np.ones((3,3))
b = torch.from_numpy(a)
np.add(a,1,out=a)
print(a)
print(b)
在上述情况下,我看到更改自动反映在输出中:
[[2. 2. 2.]
[2. 2. 2.]
[2. 2. 2.]]
tensor([[2., 2., 2.],
[2., 2., 2.],
[2., 2., 2.]], dtype=torch.float64)
但是当我写这样的东西时不会发生同样的事情:
a = np.ones((3,3))
b = torch.from_numpy(a)
a = a + 1
print(a)
print(b)
我得到以下输出:
[[2. 2. 2.]
[2. 2. 2.]
[2. 2. 2.]]
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]], dtype=torch.float64)
我在这里错过了什么?
【问题讨论】:
-
除非我弄错了,任何时候你在 Python 中写一个等号,你都是在创建一个新对象。因此,在第二种情况下,表达式的右侧使用原来的
a,然后计算出一个新对象,它替换了原来的a。b仍然指向原来a的内存位置,但现在a指向内存中的一个新对象。 -
很可能就是这样。谢谢;除了使用
np.add()之外还有其他方法可以帮助我验证您的解释吗? -
a += 1应该这样做。 -
@WarrenWeckesser 成功了!多谢!你能解释一下这与
a = a + 1有什么不同吗?我的印象是两者的意思是一样的。 -
在
a = a + 1中,表达式a + 1创建一个新数组,然后Python 将该新对象分配给名称a。使用a += 1,Python 使用参数1调用a的就地添加方法(__iadd__),numpy 代码负责将该值就地添加到现有数组中。
标签: python numpy pytorch torch tensor