python - 在NumPy中快速检查NaN

我正在寻找最快的方法来检查NumPy数组np.nan != np.nan中NaN(np.nan in X)的出现.np.isnan(X)是不可能的,因为它构建了一个形状为X.shape的布尔数组,这可能是巨大的。

我尝试了np.nan in X,但这似乎不起作用,因为np.nan != np.nan。是否有快速和内存效率的方法来做到这一点?

(对于那些会问“多么巨大”的人:我说不出来。这是图书馆代码的输入验证。)

7个解决方案

135 votes

Ray的解决方案很好。 但是,在我的机器上,使用min代替min快约2.5倍:

In [13]: %timeit np.isnan(np.min(x))

1000 loops, best of 3: 244 us per loop

In [14]: %timeit np.isnan(np.sum(x))

10000 loops, best of 3: 97.3 us per loop

与min不同,sum不需要分支,这在现代硬件上往往相当昂贵。 这可能是sum更快的原因。

编辑上面的测试是在阵列中间用一个NaN进行的。

值得注意的是,在NaN存在下,min比不存在时更慢。 随着NaN越来越接近数组的开头,它似乎也变慢了。 另一方面,无论是否存在NaN以及它们位于何处,sum的吞吐量似乎都是恒定的:

In [40]: x = np.random.rand(100000)

In [41]: %timeit np.isnan(np.min(x))

10000 loops, best of 3: 153 us per loop

In [42]: %timeit np.isnan(np.sum(x))

10000 loops, best of 3: 95.9 us per loop

In [43]: x[50000] = np.nan

In [44]: %timeit np.isnan(np.min(x))

1000 loops, best of 3: 239 us per loop

In [45]: %timeit np.isnan(np.sum(x))

10000 loops, best of 3: 95.8 us per loop

In [46]: x[0] = np.nan

In [47]: %timeit np.isnan(np.min(x))

1000 loops, best of 3: 326 us per loop

In [48]: %timeit np.isnan(np.sum(x))

10000 loops, best of 3: 95.9 us per loop

NPE answered 2019-08-02T16:57:44Z

24 votes

我认为np.isnan(np.min(X))应该做你想要的。

Ray answered 2019-08-02T16:58:11Z

17 votes

即使有一个公认的答案,我想演示以下内容(在Vista上使用Python 2.7.2和Numpy 1.6.0):

In []: x= rand(1e5)

In []: %timeit isnan(x.min())

10000 loops, best of 3: 200 us per loop

In []: %timeit isnan(x.sum())

10000 loops, best of 3: 169 us per loop

In []: %timeit isnan(dot(x, x))

10000 loops, best of 3: 134 us per loop

In []: x[5e4]= NaN

In []: %timeit isnan(x.min())

100 loops, best of 3: 4.47 ms per loop

In []: %timeit isnan(x.sum())

100 loops, best of 3: 6.44 ms per loop

In []: %timeit isnan(dot(x, x))

10000 loops, best of 3: 138 us per loop

因此,真正有效的方式可能在很大程度上取决于操作系统。 无论如何dot(.)似乎是最稳定的一个。

eat answered 2019-08-02T16:58:44Z

7 votes

这里有两种通用方法:

检查每个数组项目dot并获取dot。

应用一些保留dots(如dot)的累积操作并检查其结果。

虽然第一种方法肯定是最干净的,但是一些累积操作(特别是在BLAS中执行的那些,例如dot)的大量优化可以使这些操作非常快。 请注意,dot与其他一些BLAS操作一样,在某些条件下是多线程的。 这解释了不同机器之间的速度差异。

import numpy

import perfplot

def min(a):

return numpy.isnan(numpy.min(a))

def sum(a):

return numpy.isnan(numpy.sum(a))

def dot(a):

return numpy.isnan(numpy.dot(a, a))

def any(a):

return numpy.any(numpy.isnan(a))

def einsum(a):

return numpy.isnan(numpy.einsum('i->', a))

perfplot.show(

setup=lambda n: numpy.random.rand(n),

kernels=[min, sum, dot, any, einsum],

n_range=[2**k for k in range(20)],

logx=True,

logy=True,

xlabel='len(a)'

)

Nico Schlömer answered 2019-08-02T16:59:35Z

2 votes

如果您对numba感到满意,它可以创建快速短路(一旦找到NaN就会停止)功能:

import numba as nb

import math

@nb.njit

def anynan(array):

array = array.ravel()

for i in range(array.size):

if math.isnan(array[i]):

return True

return False

如果没有anynan,该函数可能实际上比np.min慢,我认为这是因为np.min对大型数组使用多处理:

import numpy as np

array = np.random.random(2000000)

%timeit anynan(array) # 100 loops, best of 3: 2.21 ms per loop

%timeit np.isnan(array.sum()) # 100 loops, best of 3: 4.45 ms per loop

%timeit np.isnan(array.min()) # 1000 loops, best of 3: 1.64 ms per loop

但是如果数组中有NaN,特别是如果它的位置处于低指数,那么它会快得多:

array = np.random.random(2000000)

array[100] = np.nan

%timeit anynan(array) # 1000000 loops, best of 3: 1.93 µs per loop

%timeit np.isnan(array.sum()) # 100 loops, best of 3: 4.57 ms per loop

%timeit np.isnan(array.min()) # 1000 loops, best of 3: 1.65 ms per loop

使用Cython或C扩展可以获得类似的结果,这些结果有点复杂(或者可以像anynan一样容易获得)但最终可以与我的anynan功能相同。

MSeifert answered 2019-08-02T17:00:26Z

2 votes

enter code here

使用.any()

if not np.isfinite(prop).all()

numpy.isfinite可能比isnan更好检查

if not np.isfinite(prop).all()

woso answered 2019-08-02T17:01:11Z

1 votes

与此相关的是如何找到第一次出现NaN的问题。 这是处理我所知道的最快的方法:

index = next((i for (i,n) in enumerate(iterable) if n!=n), None)

vitiral answered 2019-08-02T17:01:39Z

pythonisnan_python - 在NumPy中快速检查NaN相关推荐

  1. python数据分析(四)——numpy中的nan和数据的填充

    系列文章: python数据分析(一)--numpy数组的创建 python数据分析(二)--numpy数组的计算 python数据分析(三)--numpy读取本地数据和索引 python数据分析(五 ...

  2. java难学还是pythonnanxue_关于python:为什么numpy中的“ NaN”比“ -np.inf”更小?

    在涉及np.min或np.argmin的任何比较中,认为NaN小于-np.inf的原因是什么? import numpy as np In [73]: m = np.array([np.nan, 1. ...

  3. python找出值为nan_Python Numpy:找到list中的np.nan值方法

    这个问题源于在训练机器学习的一个模型时,使用训练数据时提示prepare的数据中存在np.nan 报错信息如下: ValueError: np.nan is an invalid document, ...

  4. 列注释_【EXCEL检查问题】:如何快速检查并删除EXCEL中隐藏的工作表、行、列等信息...

    前注:本案例是以EXCEL2016为示范软件,各版本的部分功能和路径可能不同 在EXCEL使用过程中,你是否遇到过某一列的公式怎么修改都报错的情况?你是否遇到过一个只有区区几行数据的表格,却占用了好几 ...

  5. 判断numpy的array中是否包含nan,NaN

    直接上代码 import numpy as npx = np.array([1,1,1,1,np.NaN]) isnan = np.isnan(x) # 判断每个元素是不是nan,返回[False,F ...

  6. 19【numpy中的nan和常用方法】01numpy中的nan和常用统计方法

    numpy中的nan和inf 什么是nan nan/NAN/Nan not a number 表示不是一个数字 什么时候会出现nan 当我们在做类似于0/0 无穷-无穷这种无意义的运算时 当我们读取本 ...

  7. 在Excel表格中如何快速检查两张表的不一样的数据

    在Excel表格中如何快速检查两张表的不一样的数据 目录 在Excel表格中如何快速检查两张表的不一样的数据 1.全选第一张表格,找到"开始"选项卡中"条件格式" ...

  8. python将姓王的都改成老王_Python 实现将numpy中的nan和inf,nan替换成对应的均值

    inf:infinity;正无穷 numpy中的nan和inf都是float类型 t!=t 返回bool类型的数组(矩阵) np.count_nonzero() 返回的是数组中的非0元素个数:true ...

  9. 训练中Loss为Nan的原因,梯度消失或者爆炸的优化

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 现象 如何确定是否出现梯度爆炸? 在训练过程中出现梯度爆炸会伴随一些细微的信号,如: (1)模 ...

最新文章

  1. View绘制原理 —— 画在哪?
  2. 20145234黄斐《Java程序设计》第五周
  3. 有序的两个数组在满足其中一个数组的所有数都小于另外一个数组的情况下的整体的中位数
  4. 本周有哪些值得读的 AI 论文?进来告诉你答案
  5. 9.Java中的运算符
  6. 关于一个Panel上鼠标不及时响应MouseLeave事件
  7. 搜狗输入法在idea打不了汉字_IDEA开发软件在linux环境下使用搜狗输入法无法进行中文输入...
  8. python输入的方式有几种_Python读取键盘输入的2种方法
  9. 运算符在计算机语言中的作用,深入解析C++编程中范围解析运算符的作用及使用...
  10. ue4 射线Trace Responses(踪迹响应)
  11. linux centos single,centos 6中single-request-reopen参数说明
  12. python表情包多样化聊天室_Python | 信不信我分分钟批量做你大堆的表情包?
  13. C++课程学习代码汇总基础
  14. html边框颜色线性渐变,css3设置边框颜色渐变的方法有哪些
  15. 前端传值,后端使用Map接受
  16. 如何打开mcp为后缀的文档(昆仑通态 人机界面HMI,配合PLC)
  17. 十年风雨路,中国MES市场亟呼健康的生态系统
  18. 编译安装时关于python的报错
  19. 分享 2022 年最受欢迎的黑科技工具(二)
  20. 如何把握PPT模板配色?

热门文章

  1. mongodb运算操作符
  2. 且用计算机语言怎么表示,用计算机语言表示算法.doc
  3. config.class.php,The EventConfig class - PHP 7 中文文档
  4. 机器人与目标匹配问题及解决 虚拟动力学 纳什平衡 Q-Learning
  5. vlookup使用步骤_使用vlookup出错,看看原因多为这几个!快来看看!
  6. Linux(三):VMware Tools安装
  7. html语言机标记椒用来调字体的,HTML语言 之 字体标记
  8. 圆环和环形是一样的吗_Excel不知道还可以这样做圆环图
  9. jqgrid为什么表头和数据之间有间隙_面试官:你看过Redis数据结构底层实现吗?...
  10. mongodb数据库扩展名_MongoDB如何存储数据