我发现了一些奇怪的行为,并复制了它。简单地说,为什么
np.int64(np.float64(np.nan))
输出-9223372036854775808
(正如在注释中指出的,是的,这是-2^63,双面int64的最大负值)
如果它是相关的或感兴趣的,我最初的用例是查看类型为np的数据帧索引。float64并转换为np.int64(在上面的简化示例中,我通常不会无缘无故地嵌套类型)。从一个示例数据框架开始:
0 1
NaN 1 2
1.0 3 4
NaN 5 6
然后运行:
print(df.index.values[0])
print(type(df.index.values[0]))
print(df.index.values[0].astype(np.int64))
print(type(df.index.values[0].astype(np.int64)))
打印:
nan
<class 'numpy.float64'>
-9223372036854775808
<class 'numpy.int64'>
然而,使用python类型,你不能将float nan转换为int:
print(np.nan)
print(type(np.nan))
print(np.nan.astype(np.int64))
:
nan
<class 'float'>
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-130-0d779433eac7> in <module>
1 print(np.nan)
2 print(type(np.nan))
----> 3 print(np.nan.astype(np.int64))
AttributeError: 'float' object has no attribute 'astype'
虽然在实践中我能够只是改变nan值,我知道不会是一个键(0)-我很好奇为什么类np。Float64类型的行为是这样的?
你的df.index.values
是一个numpy数组:
Out[34]: array([nan, 1., inf])
In [35]: a.dtype
Out[35]: dtype('float64')
数组有一个astype
方法,开发人员选择将特殊的浮点数(如nan
)转换为某种整数(或者允许编译器/处理器这样做)。否则就会引发一个错误。
In [36]: b=a.astype(int)
In [37]: b
Out[37]: array([-9223372036854775808, 1, -9223372036854775808])
In [38]: b.dtype
Out[38]: dtype('int64')
np.int32
、np.uint16
等产生不同的值。
用np.float64
函数创建的对象很像一个0d数组——它有许多相同的属性和方法,包括astype
:
In [39]: np.float64(np.nan)
Out[39]: nan
In [40]: np.array(np.nan)
Out[40]: array(nan)
In [41]: Out[39].astype(int)
Out[41]: -9223372036854775808
In [42]: Out[40].astype(int)
Out[42]: array(-9223372036854775808)
另一方面,np.nan
是一个Python浮点对象,并且没有astype
方法。
python
int
也不喜欢这样做:
In [52]: int(np.nan)
Traceback (most recent call last):
File "<ipython-input-52-03e21f51ddd3>", line 1, in <module>
int(np.nan)
ValueError: cannot convert float NaN to integer
astype()
是一个Pandas函数。当你处理np的时候。nan,您不能使用Pandas函数。不如用int(np.nan)