使用np.concatenate合并数组与稀疏矩阵、数值与编码分类变量报错求助
问题1:如何使用np.concatenate将NumPy数组与稀疏矩阵进行合并?
其实np.concatenate并不直接支持混合合并NumPy数组和稀疏矩阵——因为稀疏矩阵(比如scipy里的csr_matrix这类)是专门的稀疏数据结构,和普通NumPy数组的内存存储方式完全不同,numpy的函数没法直接处理它。
你有两种常用的解决思路:
- 把稀疏矩阵转换成密集NumPy数组:如果你的稀疏矩阵密度不算特别低,不会导致内存爆炸的话,可以用
toarray()方法转成普通数组,之后就能正常用np.concatenate了。比如:import numpy as np from scipy.sparse import csr_matrix dense_arr = np.array([[1,2],[3,4]]) sparse_mat = csr_matrix([[5,6],[7,8]]) # 转稀疏为密集 sparse_to_dense = sparse_mat.toarray() combined = np.concatenate([dense_arr, sparse_to_dense], axis=1) - 用scipy的稀疏矩阵合并工具:如果稀疏矩阵很大,转密集会内存溢出,那就用
scipy.sparse.hstack(横向合并,对应axis=1)或者vstack(纵向合并),这个工具可以直接混合处理NumPy数组和稀疏矩阵,它会自动把NumPy数组转成稀疏矩阵再合并:from scipy.sparse import hstack combined_sparse = hstack([dense_arr, sparse_mat]) # 如果之后需要密集数组,再转:combined_sparse.toarray()
问题2:合并数值数据与OneHot编码后的分类数据时维度不匹配的解决方案
这个报错的核心原因其实不是维度真的不匹配,而是OneHotEncoder默认输出的是稀疏矩阵(在scikit-learn 1.0之前,sparse参数默认是True;1.0及之后默认是sparse_output=False,输出密集数组),而你的cont_data是普通NumPy数组,np.concatenate没法直接混合这两种不同类型的结构,所以才报了维度相关的错误(虽然实际维度是对的,但numpy没法识别稀疏矩阵的维度格式)。
给你几个具体的解决办法:
让OneHotEncoder直接输出密集数组
在初始化编码器的时候,设置对应的参数:from sklearn.preprocessing import OneHotEncoder # 新版本sklearn(1.0+)用sparse_output=False encoder = OneHotEncoder(sparse_output=False) # 旧版本sklearn用sparse=False # encoder = OneHotEncoder(sparse=False) disc_data_coded = encoder.fit_transform(disc_data) # 现在disc_data_coded是NumPy数组,可以直接用np.concatenate合并 combined_data = np.concatenate([cont_data, disc_data_coded], axis=1)把稀疏的编码结果转成密集数组
如果已经得到了稀疏的disc_data_coded,直接用toarray()或者todense()转成NumPy数组再合并:disc_data_coded_dense = disc_data_coded.toarray() combined_data = np.concatenate([cont_data, disc_data_coded_dense], axis=1)注意:如果分类变量的基数很大,转密集数组可能会占用大量内存,这时候优先用下面的方法。
用scipy的稀疏矩阵工具合并
和问题1的思路一样,用scipy.sparse.hstack来混合处理NumPy数组和稀疏的编码结果,得到一个合并后的稀疏矩阵:from scipy.sparse import hstack combined_data_sparse = hstack([cont_data, disc_data_coded]) # 后续如果需要密集数组再转换,或者直接用稀疏矩阵做后续建模(很多sklearn模型支持稀疏输入)
内容的提问来源于stack exchange,提问作者htredleaf
相关产品推荐
相关产品推荐

