【问题标题】:Changing the np array does not change the Torch Tensor automatically?更改 np 数组不会自动更改 Torch 张量?
【发布时间】: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,然后计算出一个新对象,它替换了原来的ab 仍然指向原来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


【解决方案1】:

任何时候你在 Python 中写一个= 符号,你就是在创建一个新对象。

所以第二种情况中表达式的右侧使用原始a,然后计算为一个新对象,即a + 1,它替换了这个原始a。 b 仍然指向原来 a 的内存位置,但现在 a 指向内存中的一个新对象。

换句话说,在a = a + 1 中,表达式a + 1 创建一个新对象,然后Python 将该新对象分配给名称a

然而,对于 a += 1,Python 使用参数 1 调用 a 的就地添加方法 (__iadd__)。

numpy 代码:np.add(a,1,out=a),在 第一种情况下负责将该值原地添加到现有数组中。

(感谢@Engineero@Warren Weckesser在cmets中指出这些解释)

【讨论】:

  • 解释得很好!谢谢。
猜你喜欢
  • 2016-03-15
  • 2022-09-22
  • 2020-08-27
  • 2018-08-09
  • 2018-06-06
  • 2011-11-14
  • 2016-01-19
  • 2017-06-15
  • 1970-01-01
相关资源
最近更新 更多