【问题标题】:Why is numpy telling me that I can't convert a float NaN when I'm actually trying to convert an int?为什么 numpy 在我实际尝试转换 int 时告诉我无法转换 float NaN?
【发布时间】:2020-12-08 19:53:33
【问题描述】:

这是一个简单的 numpy 数组:

import numpy as np
x = np.array([15, 22, 3])

我想把第二个值转成nan:

x[1] = np.nan

它返回以下错误:

ValueError: cannot convert float NaN to integer

print(type(x[1]))  # this returns "<class 'numpy.int32'>"

通过将整数数组转换为浮点数数组,我设法用 NaN 替换了所需的值。

但仍然。 当我实际尝试转换 int 时,为什么 numpy 告诉我无法转换 float NaN

谢谢

【问题讨论】:

  • np.nan 是一个浮点值。没有intnan,因此numpy无法将np.nan转换为int

标签: python numpy


【解决方案1】:

numpy中,nan是一个特殊的float

>>> type(np.nan)
<class 'float'>

我称它为特殊类型的浮点数,因为如果您尝试将 intfloat 添加到单个 numpy 数组中,通常 Python 不会抱怨,因为整数会自动转换为 float

>>> x = np.array([-1, float(10.12)])
>>> x
>> array([-1.  , 10.12])

numpy.nan 并非如此:

非数字 (NaN) 的 IEEE 754 浮点表示。


我建议创建一个 numpy 浮点数组:

import numpy as np
x = np.array([15.0, 22.0, 3.0])
x[1] = np.nan

>>> array([15., nan,  3.])

如果您的用例允许这种表示,请尝试使用替代整数值表示nan。例如,使用 -1 表示 nan(例如,如果在您的用例中没有负值,这将是有意义的)。


或者,您可以使用list,它允许您存储不同数据类型的对象:

l = [15, 22, 3]
l[1] = np.nan

>>> [15, nan, 3]

【讨论】:

    【解决方案2】:

    默认情况下,数据类型假定为浮点数。

    https://stackoverflow.com/a/51607679/11501135 中所述,NumPy 数组默认数组的数据类型为float

    【讨论】:

    • 不确定这是否是真的。如果你尝试x = np.array([15, 22, 3]); print(x.dtype),它会在 numpy 1.19.2 中打印int64
    • 我认为问题是@Giorgos Myrianthous 解释的,np.nan 本身是浮动的,您不能将其插入ints 的数组中
    • @Ananda - 这个答案在多个方面都不正确。
    猜你喜欢
    • 2016-12-13
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    相关资源
    最近更新 更多