如何在Python中移除不同维度Numpy数组中的NaN值
移除含NaN的对应行解决方案
要解决这个问题,核心是先找到同时满足X对应行无NaN、y对应位置无NaN的行索引,再用这个索引统一过滤两个数组。
具体实现步骤
- 确保导入numpy(
import numpy as np) - 检测NaN位置:
- 对二维数组X,用
np.isnan(X).any(axis=1)生成每行是否含NaN的布尔数组(True表示该行有NaN) - 对一维数组y,用
np.isnan(y)生成每个元素是否为NaN的布尔数组
- 对二维数组X,用
- 筛选保留行:通过逻辑运算合并两个条件,取反后得到需要保留的行索引:
keep_rows = ~(np.isnan(X).any(axis=1) | np.isnan(y))(~取反,|表示逻辑或,即只要X行或y元素有NaN就排除) - 过滤数组:用布尔索引分别处理X和y:
X_clean = X[keep_rows]、y_clean = y[keep_rows]
结合你的代码完整示例
import numpy as np from numpy import array import pandas as pd def split_sequence(sequence, n_steps): X, y = list(), list() for i in range(len(sequence)): end_ix = i + n_steps if end_ix > len(sequence)-1: break seq_x, seq_y = sequence[i:end_ix], sequence[end_ix] X.append(seq_x) y.append(seq_y) return array(X), array(y) # 模拟你的传感器数据 df_sensorRefill = pd.DataFrame({ 'sensor': [1.7, 2.3, 3.4, np.nan, 4.6, 4.8, np.nan, np.nan, np.nan, np.nan] }) n_steps = 3 sequence = df_sensorRefill['sensor'].to_list() X, y = split_sequence(sequence, n_steps) # 清理含NaN的行 keep_rows = ~(np.isnan(X).any(axis=1) | np.isnan(y)) X_clean = X[keep_rows] y_clean = y[keep_rows] # 验证结果 for x_row, y_val in zip(X_clean, y_clean): print(x_row, y_val)
输出结果
运行后会得到你期望的干净数据:
[1.7 2.3 3.4] 4.2 [2.3 3.4 4.2] 4.6 [4.2 4.6 4.8] 4.6
内容的提问来源于stack exchange,提问作者Aggy
相关产品推荐
相关产品推荐

