多分类逻辑回归中不同形状数组的掩码创建与NaN处理问题
解决多分类逻辑回归中数组形状不匹配与NaN移除问题
问题背景
需要基于以下数组执行多分类逻辑回归:
- X:形状
(293240, 4),包含NaN值 - y:形状
(29324,),包含NaN值 - hours:形状
(293240,),包含NaN值
目标是通过hours作为掩码筛选样本,同时移除所有含NaN的样本,但创建掩码时触发错误:
ValueError: operands could not be broadcast together with shapes (293240,) (29324,)
错误原因
报错核心是数组长度不匹配:
np.all(np.isfinite(x), 1)和hours == 40生成的掩码长度均为293240np.isfinite(y)生成的掩码长度为29324
三者无法进行按位与的广播运算。结合数组长度比例(293240 ÷ 29324 = 10),可推断每个y标签对应10个X/hours样本,需先将y扩展至与X、hours相同长度。
解决方案
步骤1:扩展y数组至匹配长度
使用np.repeat将y重复对应次数(此处为10次),使其形状变为(293240,):
import numpy as np from sklearn.model_selection import train_test_split # 按数组长度比例计算重复次数,适配实际数据对应关系 repeat_times = x.shape[0] // y.shape[0] y_repeated = np.repeat(y, repeat_times)
步骤2:创建统一长度的掩码
分别生成三个维度一致的掩码,再合并为最终筛选条件:
# 掩码1:X所有特征均为非NaN mask_x = np.all(np.isfinite(x), axis=1) # 掩码2:扩展后的y为非NaN mask_y = np.isfinite(y_repeated) # 掩码3:hours等于目标值40 mask_hours = (hours == 40) # 合并掩码:仅保留同时满足三个条件的样本 regmask = mask_x & mask_y & mask_hours
步骤3:筛选数据并拆分训练测试集
用掩码筛选所有数组,确保长度一致后执行数据集拆分:
# 筛选有效样本 x_filtered = x[regmask] y_filtered = y_repeated[regmask] hours_filtered = hours[regmask] # 拆分训练测试集 X_train, X_test, y_train, y_test = train_test_split(x_filtered, y_filtered, test_size=0.25, random_state=42)
验证结果
筛选后可打印数组形状确认匹配:
print(f"筛选后X形状: {x_filtered.shape}, y形状: {y_filtered.shape}, hours形状: {hours_filtered.shape}") print(f"有效样本数量: {np.sum(regmask)}")
内容的提问来源于stack exchange,提问作者spoolito
相关产品推荐
相关产品推荐

