24

以下 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

4

2 回答 2

41

那是故意的。

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

这使 NumPy 能够+=使用现有的数组存储执行操作。另一方面,a=a+b为 sum 创建一个全新的数组,并重新绑定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')
于 2012-05-24T14:55:50.463 回答
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 在修改数组内容时更改数组的数据类型是不切实际的,并且 imo 可取。

于 2012-05-24T16:53:37.773 回答