【问题标题】:Pytorch: Updating numpy array not updating the corresponding tensorPytorch:更新numpy数组不更新相应的张量
【发布时间】:2018-06-30 10:01:06
【问题描述】:

当我运行以下代码时,

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

a 和 b 都是 2s。

但是,当我运行时:

import numpy as np
a = np.ones(3)
b = torch.from_numpy(a)
a = a+1
print(a)
print(b)

b 保持为 1s,而 a 已更新为 2s。

这是预期的行为吗?

【问题讨论】:

  • 是的。 a=a+1 创建的a 是一个新数组,与用于创建ba 没有任何连接。这不会更新a

标签: python numpy deep-learning pytorch tensor


【解决方案1】:

是的,作为@hpaulj pointed out in his comment,操作

a = a + 1

创建原始数组a 的副本并使用broadcasting 加1。而在加法之后,由于我们将它分配给a,所以a 会更新为加法运算的结果。但是,b 仍然共享原始数组 a 的内存(即更新前创建的数组 a。)

所以,我们看到这样的结果:

In [75]: a = np.ones(3)
    ...: b = torch.from_numpy(a)
    ...: a = a+1     # <========= creates copy of `a` and modifies it
    ...: print(a)
    ...: print(b)
    ...: 
[ 2.  2.  2.]

 1
 1
 1
[torch.DoubleTensor of size 3]

但是,看看你宁愿这样做会发生什么:

In [72]: a = np.ones(3)
    ...: b = torch.from_numpy(a)
    ...: a += 1      # <========== in-place modification of `a`
    ...: print(a)
    ...: print(b)
    ...:

[ 2.  2.  2.]

 2
 2
 2
[torch.DoubleTensor of size 3]

观察+= 操作如何就地 修改原始数组,而somearr = somearr + 1 创建数组的副本 somearray 然后进行修改给它。

【讨论】:

    猜你喜欢
    • 2021-09-11
    • 2018-09-20
    • 2018-11-26
    • 1970-01-01
    • 2019-08-22
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多