Python 为什么速记作业和NaN有不同的行为?

Python 为什么速记作业和NaN有不同的行为?,python,numpy,Python,Numpy,我在Python2.7.3中看到了这一点,其中包含pylab和numpy。为什么会这样: >>> x = pylab.arange(5) >>> x = x + pylab.nan >>> print x [ nan nan nan nan nan] 与此不同: >>> x = pylab.arange(5) >>> x += pylab.nan __main__:1: RuntimeWarnin

我在Python2.7.3中看到了这一点,其中包含pylab和numpy。为什么会这样:

>>> 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]
这是因为
arange(5)
返回一个整数数组,但是
nan
是一个浮点值。当您使用常规赋值时,这是可以的,因为
x+nan
透明地将
x
转换为float进行加法并返回一个float结果。但是使用
+=
,它试图将这个浮点结果放回原始的
x
,这是一个int数组。这会失败,因为int数组不能接受浮点数据


+=
与numpy数组一起使用将更新数组,如果计算结果的数据类型与原始数据类型不同,则此操作将不起作用。

删除了matplotlib标记,因为
pylab.arange
plab.nan
确实来自
numpy