gop*_*zna 6 python numpy torch pytorch tensor
我正在研究PyTorch的基本教程,并遇到了NumPy数组和Torch张量之间的转换。该文件说:
Torch Tensor和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)
Run Code Online (Sandbox Code Playgroud)
在上述情况下,我看到更改自动反映在输出中:
[[2. 2. 2.]
[2. 2. 2.]
[2. 2. 2.]]
tensor([[2., 2., 2.],
[2., 2., 2.],
[2., 2., 2.]], dtype=torch.float64)
Run Code Online (Sandbox Code Playgroud)
但是当我写这样的东西时,不会发生同样的事情:
a = np.ones((3,3))
b = torch.from_numpy(a)
a = a + 1
print(a)
print(b)
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
[[2. 2. 2.]
[2. 2. 2.]
[2. 2. 2.]]
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]], dtype=torch.float64)
Run Code Online (Sandbox Code Playgroud)
我在这里想念什么?
任何时候你=在 Python 中写一个符号,你都是在创建一个新对象。
因此,在第二种情况下,表达式的右侧使用原始 a,然后计算为一个新对象 ie a + 1,它替换了原始 a。b 仍然指向原来 a 的内存位置,但现在 a 指向了内存中的一个新对象。
换句话说,在 in 中a = a + 1,表达式a + 1创建一个新对象,然后 Python 将该新对象分配给 name a。
而使用a += 1,Python使用参数 1调用a的就地加法方法 ( __iadd__)。
numpy 代码:np.add(a,1,out=a), 在第一种情况下负责将该值添加到现有数组中。
(感谢@Engineero和@Warren Weckesser在评论中指出这些解释)
| 归档时间: |
|
| 查看次数: |
216 次 |
| 最近记录: |