numpy数据类型转换在x = x + a和x + = a中表现不同

Jas*_*son 5 python casting numpy

我注意到在python中操作一些numpy数组之间x=x+ax+=a操作之间的操作之间存在一些差异.

我试图做的只是将一些随机错误添加到整数列表,如下所示:

x=numpy.arange(12)
a=numpy.random.random(size=12)
x+=a
Run Code Online (Sandbox Code Playgroud)

但打印输出x给出一个整数列表[0,1,2,3,4,5,6,7,8,9,10,11].

事实证明,如果我使用x=x+a它,它会按预期工作.

这是我们应该注意的事情,我的意思是它表现得如此不同.我曾经认为它在x+=a和之间是完全相同的,x=x+a并且我一直在互相使用它们,而不是一直关注它们.现在,我对迄今为止所做的所有计算都非常关注和焦虑.谁知道这个问题何时何地发生,我必须仔细检查所有内容.

这是numpy中的一个错误吗?我已经在numpy版本1.2.0和1.6.1中进行了测试,他们都做到了这一点.

Fre*_*Foo 9

不,这不是一个错误,这是预期的行为.+=进行就地添加,因此它不能更改数组的数据类型x.当dtype是整数时,这意味着通过将a截断的元素添加到整数而产生的浮点临时值.由于np.random.random返回在范围内浮动[0, 1),因此结果总是被截断回到中的值x.

相比之下,x + a无论如何都需要分配一个新数组,并且当一个参数是浮点数而另一个参数是整数时,将新数组的dtype向上浮动.

避免此问题的最佳方法是明确arange调用中所需的dtype :

x = np.arange(12, dtype=float)
x += np.random.random(size=12)
Run Code Online (Sandbox Code Playgroud)

(请注意,x += ax = x + a很少在Python等效,因为后者通常修改对象指向x例如用纯Python列表:

a = []
b = a
a += [1]
Run Code Online (Sandbox Code Playgroud)

也会改变b,但a = a + [1]不会b触及.)