Por qué Numpy trata a + = b y a = a + b de manera diferente

¿Es el siguiente comportamiento numpy intencional o es un error?

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 

Versión de Python: 2.7.2, versión de Numpy: 1.6.1

Eso es intencional.

El operador += conserva el tipo de la matriz. En otras palabras, una matriz de enteros sigue siendo una matriz de enteros.

Esto permite que NumPy realice la operación += utilizando el almacenamiento de matriz existente. Por otro lado, a=a+b crea una nueva matriz para la sum, y ​​vuelve a enlazar a para apuntar a esta nueva matriz; esto aumenta la cantidad de almacenamiento utilizado para la operación.

Para citar la documentación :

Advertencia: Las operaciones en el lugar realizarán el cálculo utilizando la precisión decidida por el tipo de datos de los dos operandos, pero descenderán silenciosamente el resultado (si es necesario) para que pueda encajar en la matriz. Por lo tanto, para cálculos de precisión mixta, A {op}= B puede ser diferente de A = A {op} B Por ejemplo, supongamos que a = ones((3,3)) . Entonces, a += 3j es diferente de a = a + 3j : mientras que ambos realizan el mismo cálculo, a += 3 convierte el resultado para que se ajuste a a , mientras que a = a + 3j vuelve a unir el nombre a al resultado.

Finalmente, si se está preguntando por qué a matriz de enteros era, en primer lugar, considere lo siguiente:

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

@aix tiene toda la razón. Solo quería señalar que esto no es exclusivo de numpy. Por ejemplo:

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

Como puede ver, += modifica la lista y + crea una nueva lista. Esta espera para adormecer también. + crea una nueva matriz para que pueda ser cualquier tipo de datos. += modifica la matriz en el lugar y no es práctico, e imo deseable, para que el número cambie el tipo de datos de una matriz cuando se modifica el contenido de la matriz.