以下numpy行为是故意还是错误?
from numpy import *
a = arange(5)
a = a+2.3
print 'a = ', a
# Output: a = 2.3, 3.3, 4.3, 5.3, 6.3
a = arange(5)
a += 2.3
print 'a = ', a
# Output: a = 2, 3, 4, 5, 6
Python版本:2.7.2,Numpy版本:1.6.1
答案 0 :(得分:41)
这是故意的。
+=
运算符保留数组的类型。换句话说,整数数组仍然是整数数组。
这使NumPy能够使用现有阵列存储执行+=
操作。另一方面,a=a+b
为总和创建一个全新的数组,并重新绑定a
以指向这个新数组;这会增加用于操作的存储量。
警告:就地操作将使用由两个操作数的数据类型决定的精度执行计算,但是会默默地向下转换结果(如果需要),以便它可以适应数组。因此,对于混合精度计算,
A {op}= B
可能与A = A {op} B
不同。例如,假设a = ones((3,3))
。然后,a += 3j
与a = 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')
答案 1 :(得分: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。 +
创建一个新数组,因此它可以是任何数据类型。 +=
修改了数组,并且非常合适,因为numpy在修改数组内容时更改了数组的数据类型。