为什么短手分配和NaN有不同的行为?

cha*_*ppy 4 python numpy

我在python 2.7.3中看到了这个,同时有pylab和numpy.为什么是这样:

>>> x = pylab.arange(5)
>>> x = x + pylab.nan
>>> print x
[ nan  nan  nan  nan  nan]
Run Code Online (Sandbox Code Playgroud)

与此不同:

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

Bre*_*arn 7

这是因为arange(5)返回一个整数数组,但它nan是一个浮点值.当你是常规赋值时,这是可以的,因为x + nan透明地转换x为float来执行添加并返回float结果.但是+=,它会尝试将此float结果放回原始数据x,这是一个int数组.这失败了,因为int数组不能接受float数据.

使用+=numpy数组会更新数组,如果计算结果的数据类型与原始数据类型不同,则无法使用.