2012-05-24 101 views

回答

41

这是故意的。

+=运算符保留阵列的类型。换句话说,整数数组仍然是一个整数数组。

这使NumPy能够使用现有阵列存储执行+=操作。另一方面,a=a+b创建了一个全新的数组,并重新指定a指向这个新数组;这增加了用于该操作的存储量。

引述documentation

警告:在放操作将执行使用由所述两个操作数的数据类型所决定的精度的计算,但将静默向下转换的结果(如果需要的话),以便它可以适应阵列。因此,对于混合精度计算,A {op}= B可能与A = A {op} B不同。例如,假设a = ones((3,3))。然后,a += 3ja = a + 3j不同:虽然它们都执行相同的计算,但a += 3会将结果转换回a,而a = a + 3j会将名称a重新绑定到结果。

最后,如果你想知道为什么a是摆在首位的整数数组,考虑以下因素:

In [3]: np.arange(5).dtype 
Out[3]: dtype('int64') 

In [4]: np.arange(5.0).dtype 
Out[4]: dtype('float64') 
+0

我知道a是一个整数,但是,在Python中添加浮点数和整数的预期结果是浮点数,所以这是一个意外的“特征” – Dhara

+4

@Dhara:我同意当遇到第一次遇到这种情况。它也可以是有用的。无论如何,我已经从解释行为的文档中添加了一段引文。 – NPE

+0

就地操作可以更快(没有分配,更好的缓存利用率),并且如果您可以保留对此数组的所有现有引用(如果您有多毛的数据结构)。这些对于C/C++/Fortran背景的程序员也非常有用。 –

8

@aix是完全正确。我只想指出这不是numpy的独特之处。例如:

>>> a = [] 
>>> b = a 
>>> a += [1] 
>>> print a 
[1] 
>>> print b 
[1] 
>>> a = a + [2] 
>>> print a 
[1, 2] 
>>> print b 
[1] 

正如你可以看到+=修改了列表和+创建一个新的列表。这也适用于numpy。 +创建一个新的数组,因此它可以是任何数据类型。 +=修改阵列的位置,这是不实际的,并且imo可取,因为当数组内容被修改时numpy改变数组的数据类型。

+0

好点,谢谢 – Dhara

相关问题