2013-06-21 94 views
5

在这种情况下,为什么x += y产生与x = x + y不同的结果?Numpy,为什么`x + = y`产生与`x = x + y`不同的结果?

import numpy as np 

x = np.repeat([1], 10) 
y = np.random.random(len(x)) 

x += y 
print x 
# Output: [1 1 1 1 1 1 1 1 1 1] 

x = x + y 
print x 
# Output: [ 1.50859536 1.31434732 1.15147365 1.76979431 1.64727364 
#   1.02372535 1.39335253 1.71878847 1.48823703 1.99458116] 
+0

确实是一个重复的。简短的回答:取决于执行魔法“dunder”方法'__add__'和'__iadd__' –

+3

**这不是重复的**,这是特定于'numpy' – jamylak

+0

@jamylak哦 - 的确,谢谢! –

回答

9

虽然链接的问题介绍了一般性的问题,对于这种特殊情况下的特定numpy的-解释。基本上,这些答案说“它取决于所涉及的变量的类型”,下面给出的是numpy类型的解释。

当你做x + y时,numpy对结果使用“最低公分母”数据类型。由于x是int而y是浮点数,这意味着它返回一个浮点数组。

但是,当你做x += y,你迫使它符合x,这是int dtype。这将截断小数部分,并将所有x值都留在1.这是numpy定义增强赋值运算符的方式:它强制返回值与赋值目标具有相同的dtype。

您可以通过执行x = (x + y).astype(int)(显式强制dtype返回int)从第二个示例中获得第一个行为。您可以通过设置x = np.repeat([1.0], 10)(使用浮点数使x具有dtype浮点数,因此现在可以将y添加到其中而不截断)从第一个示例中获得第二个行为。

2

由于__add____iadd__方法

然而通常的差值可变之间看到VS不变对象

>>> x = np.repeat([1], 10) 
>>> y = np.random.random(len(x)) 
>>> x += y 
>>> x 
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1]) 

对比度与

>>> x = np.repeat([1.0], 10) 
>>> x += y 
>>> x 
array([ 1.05192255, 1.00844068, 1.27569982, 1.40997015, 1.17270114, 
     1.27335121, 1.70719855, 1.72778867, 1.64679031, 1.23241938]) 

所以__iadd__之间的差正在导致添加被截断回来当x为int类型

INT这是有道理的,如果你仔细想想 - x不能幻化的类型它的元素(如将它存储这些额外的字节)

__add__有产区没有问题一个新的浮游物数组而不是整数

相关问题