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

标签 python arrays numpy

在 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

最佳答案

这是一种方法-

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

关于python - 在 numpy 数组中查找连续重复的 nan,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41721674/

相关文章:

python - python 中的 timeit 模块无法识别 numpy 模块

arrays - 使用 R 将多个文件加载到矩阵中

c++ - 制作和访问共享指针数组

python - 阈值图像数组和渲染的有效方法 - Python/NumPy/OpenCV

python - 有没有更好的方法来确保变量只包含数字

arrays - 计算数组中出现的次数

python - 无需重新排列内存的 3×n 数组的紧凑规范

python - PyPDF2 在打开不安全文件时是否采取任何安全措施?

python - 如何导入已导入的具有相同文件名的python模块?

python - 只读取 Excel 文件的标题