如何仅用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
相关产品推荐
相关产品推荐

