python - PyTorch 在张量和 numpy 数组之间的转换 : the addition operation

标签 python numpy pytorch

我正在关注 60-minute blitz on PyTorch但对将 numpy 数组转换为张量有疑问。教程示例 here .

这段代码:

import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
np.add(a, 1, out=a)
print(a)
print(b)

产量

[2. 2. 2. 2. 2.]

tensor([2., 2., 2., 2., 2.], dtype=torch.float64)

不过

import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
a = a + 1 #the diff is here 
print(a)
print(b)

产量

[2. 2. 2. 2. 2.]

tensor([1., 1., 1., 1., 1.], dtype=torch.float64)

为什么输出不同?

最佳答案

这实际上与 PyTorch 关系不大。比较

import numpy as np
a = np.ones(5)
b = a

紧随其后

np.add(a, 1, out=a)
print(b)

a = a + 1
print(b)

np.add(a, 1, out=a)a = a + 1 是有区别的。在前者中,您保留具有不同值(2 而不是 1)的相同对象(数组)a;在后者中,您会得到一个 数组,它绑定(bind)到相同的变量名a 并且具有2 的值。然而,“原始”a 被丢弃,除非有其他东西(b)指向它,否则将被释放。换句话说,第一个操作是就地的,而后者是异地的。由于 b 保留了最初在 a 处找到的数组,因此将 a + 1 重新分配给 a 不会影响b 的值。另一种就地突变语法是

a[:] = a + 1
print(b)

关于PyTorch,很简单。 from_numpy 创建一个为实际对象(数组)起别名的张量,因此它等同于我第一个代码段中的 b = a 行。张量将跟踪调用时名为 a 的数组的变化,而不是名称 a 指向的变化。

关于python - PyTorch 在张量和 numpy 数组之间的转换 : the addition operation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55040217/

相关文章:

pytorch - 从检查点加载模型不起作用

python-3.x - Pytorch DataLoader 类错误

python - 在 Pygame 中获取键盘输入的更简单方法?

python - 了解Python中的map函数——索引重新分配

python - Pandas,根据其他列值删除重复行

python - 带有 numpy 的 N*M*M 张量的矢量化(部分)逆

Python:如何从 numpy 中的矩阵中消除所有零行

python - 将张量列表转换为张量 pytorch

python - 导入错误: cannot import name BayesianGaussianMixture

python - 在numpy中提取数字数组函数的值