You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅用Numpy寻找二维数组中最长的非空连续段?

仅使用Numpy获取两行数组中连续非空值的最长段

我有一个形状为(2,12)的数组ab:

import numpy as np

ab = np.array([[0,3,6,3,np.nan,3,7,3,5,4,3,np.nan],
      [5,9,np.nan,3,7,5,3,6,4,np.nan,np.nan,np.nan]])

想要获取两行中连续非空值的最长段,示例的期望输出为:

[[3. 7. 3. 5.]
 [5. 3. 6. 4.]]

我已通过转为DataFrame实现需求:

import pandas as pd

df = pd.DataFrame(ab.T)
seq = np.array(df.dropna(how='any').index)
longest_seq = max(np.split(seq, np.where(np.diff(seq)!=1)[0]+1), key=len)
print(df.iloc[longest_seq])

    0    1
5  3.0  5.0
6  7.0  3.0
7  3.0  6.0
8  5.0  4.0

但我想知道是否存在仅使用Numpy的解决方案?


纯Numpy实现方案

步骤说明:

  • 找出所有两行均非空的列索引:用np.isnan标记空值,再筛选出两行都不为空的列位置
  • 拆分连续索引段:通过np.diff定位索引中断点,拆分出所有连续的索引序列
  • 筛选最长连续段:找出长度最大的连续索引段,提取对应列的数组

完整代码:

import numpy as np

ab = np.array([[0,3,6,3,np.nan,3,7,3,5,4,3,np.nan],
      [5,9,np.nan,3,7,5,3,6,4,np.nan,np.nan,np.nan]])

# 获取两行都不为NaN的列索引
valid_cols = np.where(~np.isnan(ab).any(axis=0))[0]

if len(valid_cols) == 0:
    print("无有效连续非空段")
else:
    # 找到索引中断的位置
    split_points = np.where(np.diff(valid_cols) != 1)[0] + 1
    # 拆分连续序列
    continuous_seqs = np.split(valid_cols, split_points)
    
    # 找到最长的连续段
    longest_seq = max(continuous_seqs, key=lambda x: len(x))
    
    # 提取对应列并输出
    result = ab[:, longest_seq]
    print(result)

运行结果:

[[3. 7. 3. 5.]
 [5. 3. 6. 4.]]

内容的提问来源于stack exchange,提问作者Mike Gacho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 05:24:21