当在python中处理一些numpy数组时,我注意到x=x+ax+=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+=ax=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 += ax = x + a在Python中很少等效,因为后者通常会修改x指向的对象。例如,使用纯Python列表:
a = []
b = a
a += [1]

同时修改b,而a = a + [1]将使b保持不变。)

10-06 06:00