onehot的transform方法输出矩阵为numpy的稀疏矩阵

本文探讨了在处理机器学习模型输出的稀疏矩阵时,如何解决与稠密矩阵拼接的问题。通过使用OneHotEncoder对模型应用结果进行编码,并采用todense()函数或scipy.sparse的hstack()函数实现稀疏与稠密矩阵的有效整合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

xgb_enc_1 = OneHotEncoder()
xgb_enc_2 = OneHotEncoder()

xgb_enc_1.fit(model_1.apply(train_gb))
xgb_enc_2.fit(model_2.apply(train_gb))
#transform输出据真为稀疏矩阵,train_lr为numpy的稠密矩阵
temp_1 = xgb_enc_1.transform(model_1.apply(train_lr))
temp_2 = xgb_enc_2.transform(model_2.apply(train_lr))
temp_3 = train_lr

temp_1
Out[24]: 
<256x1624 sparse matrix of type '<class 'numpy.float64'>'
	with 217600 stored elements in Compressed Sparse Row format>

temp_2
Out[25]: 
<256x1977 sparse matrix of type '<class 'numpy.float64'>'
	with 217600 stored elements in Compressed Sparse Row format>

temp_3.shape
Out[31]: (256, 14)

如果直接使用np.hstack进行拼接:

train_lr_ext_2 = np.hstack((temp_1,temp_3))
报错:
ValueError: all the input arrays must have same number of dimensions

稀疏矩阵与稠密矩阵维度不一致,解决此问题两种方法:

  1. todense()函数
 a = temp_1.todense()

train_lr_ext_2 = np.hstack((a,temp_3))

train_lr_ext_2.shape
Out[34]: (256, 1638)
  1. 使用scipy.saprse的hstack()函数进行拼接
from scipy.sparse import hstack

b = hstack((temp_1,temp_3))

b.shape
Out[39]: (256, 1638)
<think>嗯,用户再次询问稀疏矩阵的具体应用和解决内存错误的方法,看来ta在实际操作中遇到了大矩阵处理的瓶颈。之前虽然提到过数据分块和类型降级,但ta更关注稀疏矩阵这个特定方案,说明问题可能涉及高维特征或网络关系型数据。用户应该是数据科学家或算法工程师,正在处理类似NLP的bag-of-words模型或推荐系统场景——这类数据天然稀疏。ta的焦虑点很明确:明明知道矩阵里90%都是零值,却还在用密集矩阵消耗内存。有趣的是,ta特意提到“参考站内引用”后又澄清非真实需求,暗示需要更落地的技术路径而非理论论述。需要重点强调三个实战要点:首先是格式选择,比如Ta能否接受SciPy的CSR格式索引开销;其次是转换时机,如果原始数据已经是COO格式就要避免转Dense再转Sparse的致命浪费;最后是内存监控,必须让ta看到稀疏化前后的具体内存对比数字才够说服力。啊,差点忽略用户环境限制。在“虚拟内存已调大仍报错”的前提下,要特别提醒GPU场景的特殊性:像PyTorch的sparsetensor在CUDA上的支持有限,如果ta在用深度学习可能得折衷处理。另外当非零元素超过30%时,稀疏矩阵反而会变慢,这个阈值判断对用户决策很关键。示例代码应该包含典型错误场景:比如用toarray()做矩阵乘法这种内存炸弹操作。还要补充冷门但实用的技巧——用scipy.sparse.save_npz直接序列化比pickle省空间50%以上。最后用医疗影像和社交网络的真实案例说明压缩效果,毕竟用户需要具象的收益感知。</think> 以下是如何使用稀疏矩阵解决 `ArrayMemoryError` 的详细方案: --- ### 一、稀疏矩阵的核心原理 **适用场景**:当矩阵中**非零元素比例<5%** 时,稀疏矩阵能显著降低内存占用(约90%+) **数学原理**: $$ \text{内存节省率} = 1 - \frac{\text{稀疏矩阵内存}}{\text{密集矩阵内存}} \times 100\% $$ $$ \text{其中密集矩阵内存} = \text{行数} \times \text{列数} \times \text{元素字节数} $$ --- ### 二、Python实现(SciPy库) #### 1. 创建稀疏矩阵 ```python from scipy import sparse import numpy as np # 生成100,000×100,000的稀疏矩阵(非零元素1%) shape = (100000, 100000) # COO格式(最灵活的存储) coo_matrix = sparse.coo_matrix(( np.array([1.2, 3.4, 5.6]), # 非零值 (np.array([0, 100, 999]), # 行坐标 np.array([99, 1, 99999]))), # 列坐标 shape=shape ) # CSR格式(高效的行操作) csr_matrix = coo_matrix.tocsr() # COO转CSR # 内存对比 dense_memory = shape[0]*shape[1]*8 # 100,000²×8B ≈ 80GB sparse_memory = csr_matrix.data.nbytes + csr_matrix.indptr.nbytes + csr_matrix.indices.nbytes print(f"稀疏矩阵内存: {sparse_memory/(1024**2):.1f} MB (仅为密集矩阵的 {sparse_memory/dense_memory:.2%})") ``` #### 2. 高效操作技巧 ```python # 正确:稀疏矩阵专用乘法 result = csr_matrix.dot(np.random.rand(100000, 10)) # 错误:转换为密集矩阵(将导致内存爆炸) try: dense_version = csr_matrix.toarray() # 触发ArrayMemoryError except MemoryError: print("拒绝转换为密集矩阵!") ``` #### 3. 稀疏矩阵格式选择指南 | 格式 | 适用场景 | 是否可写 | 计算效率 | |--------|---------------------------|----------|----------| | **COO**| 增量构建矩阵[^1] | ✓ | 低 | | **CSR**| 行切片/矩阵乘法[^2] | ✗ | 高 | | **CSC**| 列切片/方程求解 | ✗ | 高 | | **DIA**| 对角线元素为主的结构 | ✗ | 中 | --- ### 三、真实应用场景 #### 案例1:自然语言处理(词袋模型) ```python # 200万文档×50万词汇表 from sklearn.feature_extraction.text import CountVectorizer vectorizer = CountVectorizer( max_features=500000, binary=True, dtype=np.int8 # 使用1字节存储 ) sparse_bow = vectorizer.fit_transform(text_corpus) # 结果自动为CSR格式 ``` #### 案例2:社交网络分析 ```python # 100万用户的邻接矩阵 adj_matrix = sparse.lil_matrix((1000000, 1000000)) # LIL格式支持动态修改 # 增量添加关系 (用户123关注用户456) adj_matrix[123, 456] = 1 # 转换为CSC格式进行PageRank计算 csc_matrix = adj_matrix.tocsc() ``` --- ### 四、避开稀疏矩阵的"内存陷阱" 1. **避免隐式转换**: ```python # 危险操作:稀疏矩阵与标量比较会生成密集bool矩阵 mask = (csr_matrix > 0) # 内存爆炸! # 正确做法:使用稀疏矩阵的sign()方法 nonzero_mask = csr_matrix.sign() # 保持稀疏性 ``` 2. **慎用链式操作**: ```python # 低效:连续转换格式 csr_matrix.tocoo().tolil() # 产生额外复制 # 高效:直接构建目标格式 lil_matrix = sparse.lil_matrix(coo_matrix) ``` --- ### 五、进阶内存优化组合 ```mermaid graph LR A[原始数据] --> B{稀疏矩阵<br>适用性检查} B ----> C[使用COO/CSR格式] B ----> D[分块处理+数据类型降级] C --> E[避免toarray()转换] D --> F[用np.memmap磁盘映射] E & F --> G[最终结果] ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值