在numpy数组中查找连续的重复nan

发布于 2021-01-29 14:57:26

在numpy数组中找到最大连续重复nan的最佳方法是什么?

例子:

from numpy import nan

输入1: [nan, nan, nan, 0.16, 1, 0.16, 0.9999, 0.0001, 0.16, 0.101, nan, 0.16]

输出1: 3

输入2: [nan, nan, 2, 1, 1, nan, nan, nan, nan, 0.101, nan, 0.16]

输出2: 4

关注者
0
被浏览
84
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这是一种方法-

    def max_repeatedNaNs(a):
        # Mask of NaNs
        mask = np.concatenate(([False],np.isnan(a),[False]))
        if ~mask.any():
            return 0
        else:
            # Count of NaNs in each NaN group. Then, get max count as o/p.
            c = np.flatnonzero(mask[1:] < mask[:-1]) - \
                np.flatnonzero(mask[1:] > mask[:-1])
            return c.max()
    

    这是一个改进的版本-

    def max_repeatedNaNs_v2(a):
        mask = np.concatenate(([False],np.isnan(a),[False]))
        if ~mask.any():
            return 0
        else:
            idx = np.nonzero(mask[1:] != mask[:-1])[0]
            return (idx[1::2] - idx[::2]).max()
    

    基准测试@pltrdy's comment-

    In [77]: a = np.random.rand(10000)
    
    In [78]: a[np.random.choice(range(len(a)),size=1000,replace=0)] = np.nan
    
    In [79]: %timeit contiguous_NaN(a) #@pltrdy's solution
    100 loops, best of 3: 15.8 ms per loop
    
    In [80]: %timeit max_repeatedNaNs(a)
    10000 loops, best of 3: 103 µs per loop
    
    In [81]: %timeit max_repeatedNaNs_v2(a)
    10000 loops, best of 3: 86.4 µs per loop
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看