我正在学习 PyTorch 的基础教程,并了解了 NumPy 数组和 Torch 张量之间的转换。文档中提到:
“Torch张量和NumPy数组将共享它们底层的内存位置,更改其中一个将更改另一个。”
但是,在下面的代码中似乎不是这种情况:
在上述情况下,我看到更改自动反映在输出中:
但是当我写出像这样的内容时,情况并非如此:
我得到了以下输出:
这里我漏掉了什么?
“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)
这里我漏掉了什么?
a
,然后计算出一个新对象,该对象替换了这个原始的a
。b
仍然指向原始a
的内存位置,但现在a
指向内存中的一个新对象。 - Engineeronp.add()
之外,还有其他方法可以帮助我验证您的解释吗? - gopalkriznaa += 1
应该可以。 - Warren Weckessera = a + 1
中,表达式a + 1
创建一个新的数组,然后 Python 将该新对象分配给名称a
。而使用a += 1
,Python 调用a
的原地加法方法(__iadd__
) 并使用参数1
,numpy 代码负责在原地将该值添加到现有数组中。 - Warren Weckesser