为什么类型为 <类 'numpy.float64'> 的 nan 返回 -9223372036854775808 作为 int64?



我发现了一些奇怪的行为,并复制了它。简单地说,为什么

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.int32np.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方法。

pythonint也不喜欢这样做:

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)

相关内容

  • 没有找到相关文章

最新更新