2013-09-08 1 views
4

Я вижу это в python 2.7.3, как с pylab, так и с numpy. Почему это:Почему существует другое поведение с коротким назначением и NaN?

>>> x = pylab.arange(5) 
>>> x = x + pylab.nan 
>>> print x 
[ nan nan nan nan nan] 

отличается от этого:

>>> x = pylab.arange(5) 
>>> x += pylab.nan 
__main__:1: RuntimeWarning: invalid value encountered in add 
>>> print x 
[-9223372036854775808 -9223372036854775808 -9223372036854775808 
-9223372036854775808 -9223372036854775808] 

?

+0

удаленный тег matplotlib, потому что 'pylab.arange' и' plab.nan' действительно от 'numpy'. – tacaswell

ответ

7

Это потому, что arange(5) возвращает массив целых чисел, но nan - значение поплавка. Когда вы являетесь обычным назначением, это нормально, потому что x + nan прозрачно преобразует x в float, чтобы выполнить добавление и возвращает результат поплавка. Но с += он пытается вернуть этот результат поплавка обратно в исходный x, который является массивом int. Это не удается, поскольку массив int не может принимать данные с плавающей запятой.

Использование += с массивами numpy обновляет массив на месте, и это не сработает, если результат вашего вычисления отличается от типа данных.