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

使用np.delete处理Pipeline输出数组时的形状异常及警告问题

解决np.delete处理Pipeline输出后形状变为()的问题

看起来你遇到的问题根源在于Pipeline输出的是稀疏矩阵,而非普通numpy数组,np.delete并不支持直接操作稀疏矩阵,才导致了奇怪的标量输出和 deprecation 警告。

问题分析

ColumnTransformer配合OneHotEncoder(默认sparse=True)时,fit_transform()返回的是scipy.sparse.csr_matrix类型的稀疏矩阵,而不是numpy的ndarray。当你直接对稀疏矩阵调用np.delete(),numpy无法正确解析这个数据结构,错误地将其当成标量处理,最终返回一个标量(形状为()),同时抛出警告提示这种行为未来会被移除。

解决方案

这里提供三种可行的解决方法,你可以根据数据集大小和需求选择:

1. 转换为numpy数组后操作(适合小数据集)

如果你的数据集内存占用不大,可以先把稀疏矩阵转为普通numpy数组,再用np.delete:

# 把稀疏矩阵转为numpy数组
ppto_full_array = ppto_full.toarray()
# 删除指定列
tallos = np.delete(ppto_full_array, [111, 112, 113], axis=1)
print(tallos.shape)  # 预期输出:(12931, 111)

2. 使用scipy稀疏矩阵的delete方法(高效适合大数据)

scipy为稀疏矩阵提供了专门的delete方法,无需转换格式,效率更高:

from scipy.sparse import delete

# 直接对稀疏矩阵执行列删除
tallos = delete(ppto_full, [111, 112, 113], axis=1)
print(tallos.shape)  # 预期输出:(12931, 111)

3. 提前筛选特征(更优雅的Pipeline集成方式)

如果可以提前确定要保留的特征,建议在Pipeline流程中就完成筛选,避免后续的数组操作:

# 获取所有处理后的特征名称
feature_names = (num_attribs + 
                 list(full_pipeline.named_transformers_['cat'].get_feature_names_out(cat_attribs)))

# 生成要保留的特征索引(排除111,112,113)
keep_indices = [idx for idx, name in enumerate(feature_names) if idx not in {111, 112, 113}]

# 通过索引筛选特征(稀疏矩阵和numpy数组都支持这种切片方式)
tallos = ppto_full[:, keep_indices]
print(tallos.shape)

这样操作不仅能避免错误,还能让你的数据处理流程更清晰可控。

内容的提问来源于stack exchange,提问作者Juan Gonzalez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 21:27:58