Numpy整数nan [重复]

Posted

技术标签:

【中文标题】Numpy整数nan [重复]【英文标题】:Numpy integer nan [duplicate] 【发布时间】:2012-09-24 09:35:24 【问题描述】:

有没有办法将 NaN 存储在 Numpy 整数数组中? 我明白了:

a=np.array([1],dtype=long)
a[0]=np.nan

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: cannot convert float NaN to integer

【问题讨论】:

【参考方案1】:

不,你不能,至少对于当前版本的 NumPy。 nan 是浮点数组的特殊值only

关于引入一个特殊位的讨论,该位将允许非浮点数组存储实际上对应于 nan 的内容,但到目前为止(2012/10),这只是讨论。

与此同时,您可能需要考虑numpy.ma 包:您可以使用特殊的numpy.ma.masked 值来表示无效值,而不是选择像-99999 这样的无效整数。

a = np.ma.array([1,2,3,4,5], dtype=int)
a[1] = np.ma.masked
masked_array(data = [1 -- 3 4 5],
             mask = [False  True False False False],
       fill_value = 999999)

【讨论】:

但请注意,使用掩码数组会产生巨大的性能成本,因为它们是在纯 python 中实现的! @gaborous 哇,真的吗?我认为他们是做这些事情的推荐方法? @endolith 是的,我很久以前在 numpy 的 github 问题之一中找到了该信息,但我不再拥有该链接。但是,由于很久以前,这可能已经过优化(尽管我对此表示怀疑,但需要先编译为 cython 或类似的)。 要明确一点,nannull 不是一回事。此外,虽然它不是numpy 的直接替代品,但cuDF 确实支持空值。【参考方案2】:

nan 只是一个浮点数,整数中没有它的表示,所以没有:)

选择一个无效值,例如 -99999

【讨论】:

选择一个无效的规范值不是一个好的解决方案,因为它不会复制与 nan 相同的属性,即:nan 与包括其自身在内的任何其他值之间的比较应该是 false。跨度> 使用哨兵值并不理想,但在您充分了解数据以知道哨兵不会干扰您的计算的情况下就足够了。例如,如果您知道您的值(不仅仅是“应该”)总是&gt;= 0,那么使用负标记是可以接受的(除非您正在执行的操作结果可能与输入的符号不同,例如如-1 * -1)。如果您正在编写一个框架并最终使用哨兵,您可能应该允许用户在单个操作的基础上选择该值。同样,不理想 如果你的数据集不会改变,那么有两种最接近理想的简单方法:np.amin()-1 和 np.amax()+1。现在您的占位符值将是唯一的,除了 np.amin() == np.iinfo(np.int32).min 或 np.amax()==np.iinfo(np.int32).max 的情况.在这些情况下,可以使用 np.unique() 并且如果唯一的数量等于数据类型的大小,则必须抛出错误,因为不可能有占位符。否则,通过获取 np.diff() 并查看存在差异的第一个位置等,有效地搜索不在 np.unique() 中的第一个值。 前哨值实际上用于许多现实世界的数据库中,尤其是在医疗保健行业,例如新生儿体重,其中使用 -1 表示出生不成功。

以上是关于Numpy整数nan [重复]的主要内容,如果未能解决你的问题,请参考以下文章

NumPy 或 Pandas:将数组类型保持为整数,同时具有 NaN 值

用整数替换 node.js 中的 NaN [重复]

创建用 NaN 填充的 numpy 矩阵

从 pandas 转换为 numpy 后,如果数组包含 nan,则删除“nan”或减少 numpy 数组的长度 [重复]

Python\Numpy:将数组与 NAN 进行比较 [重复]

Numpy重复将`nan`转换为`str`