【问题标题】:Python in-place operator (as "+="), numpy array and identity function not working properly?Python 就地运算符(如“+=”)、numpy 数组和标识函数无法正常工作?
【发布时间】:2016-02-20 19:56:29
【问题描述】:

数组ynzn 在数值上是相等的,但是有一个奇怪的区别: 正如预期的那样,yn += 7 行不会更改tn 数组,但倒数第二行zn += 7 会更改tn 数组!

这是代码:

import numpy as np
def f(x): return (1*x)
def g(x): return (x)
nn = 5
tn = np.zeros(nn)
yn = np.zeros(nn)
zn = np.zeros(nn)

tn = np.linspace(0,1,nn)
yn = f(tn)
zn = g(tn)

print('tn at step1 =',tn)
yn += 7  #as expected, this line does not change tn.
print('tn at step2 =',tn)
zn += 7  #why this line adds 7 to tn array?!
print('tn at step3 =',tn)

输出是:

tn at step1 = [ 0.    0.25  0.5   0.75  1.  ]
tn at step2 = [ 0.    0.25  0.5   0.75  1.  ]
tn at step3 = [ 7.    7.25  7.5   7.75  8.  ] *why is 7 added to tn array?!*

涉及的注意事项:

  • numpy 数组
  • g(x) 作为恒等函数
  • 就地 iadd 运算符 (+=)

虽然我已经使用zn = zn + 7 而不是zn += 7 解决了这个问题,但我的问题是:为什么在倒数第二行zn += 7 更改tn 数组?

【问题讨论】:

  • 几个编码点。 tn 等的初始 zeros 定义被以后的赋值覆盖。你不需要它们。在g 中,() 不添加任何内容。使用return x,或在答案return x.copy() 中推荐。

标签: python numpy operator-keyword in-place


【解决方案1】:

当你定义g() 时,你让它返回它的参数不变。因此,当您说zn = g(tn) 时,实际上是在说zn = tn。因此,zn 现在只是tn 的另一个名称。 += 运算符相当x = x + 完全相同。它通常做同样的事情,但在后台调用名为__iadd__ 的方法。由于zntn 现在是同一个对象,因此您正在调用tn__iadd__ 方法。因此,tn 被修改。要改变它,你可以在第一次定义它时说zn = tn.copy();或者您可以在尝试添加 7 时说 zn = zn + 7

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-12
    • 2015-11-27
    • 2015-04-25
    • 1970-01-01
    • 2019-03-05
    • 2012-02-04
    • 2015-04-27
    • 1970-01-01
    相关资源
    最近更新 更多