为什么Numpy以不同方式处理+ = b和a = a + b

Dha*_*ara 24 python numpy

以下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
Run Code Online (Sandbox Code Playgroud)

Python版本:2.7.2,Numpy版本:1.6.1

NPE*_*NPE 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')
Run Code Online (Sandbox Code Playgroud)

  • @Dhara:我同意这在首次遇到时可能会出乎意料.它也很有用.无论如何,我已经从解释行为的文档中添加了一个引用. (4认同)

Bi *_*ico 8

@aix是完全正确的.我只想指出这不是numpy独有的.例如:

>>> a = []
>>> b = a
>>> a += [1]
>>> print a
[1]
>>> print b
[1]
>>> a = a + [2]
>>> print a
[1, 2]
>>> print b
[1]
Run Code Online (Sandbox Code Playgroud)

如您所见,+=修改列表并+创建新列表.这也适用于numpy.+创建一个新数组,因此它可以是任何数据类型.+=修改数组inplace并且这是不实际的,并且非常希望numpy在修改数组内容时更改数组的数据类型.