当在python中处理一些numpy数组时,我注意到x=x+a
和x+=a
之间的操作之间存在一些差异。
我试图做的只是向整数列表中添加一些随机错误,如下所示:
x=numpy.arange(12)
a=numpy.random.random(size=12)
x+=a
但是打印出
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中进行了测试,他们都做到了这一点。
最佳答案
不,这不是错误,这是预期的行为。 +=
进行就地加法,因此它不能更改x
数组的数据类型。当dtype为整数时,这意味着将a
的元素相加而产生的浮点临时数将被截断为整数。由于np.random.random
返回的浮点数在[0, 1)
范围内,因此结果总是被截断为x
中的值。
相比之下,x + a
无论如何都需要分配一个新数组,并且当一个参数为float且另一个为整数时,将该新数组的dtype上浮为float。
避免此问题的最佳方法是在arange
调用中明确要求的dtype:
x = np.arange(12, dtype=float)
x += np.random.random(size=12)
(请注意
x += a
和x = x + a
在Python中很少等效,因为后者通常会修改x
指向的对象。例如,使用纯Python列表:a = []
b = a
a += [1]
同时修改
b
,而a = a + [1]
将使b
保持不变。)