如何对Scipy稀疏COO矩阵特定列元素求和以重塑矩阵
解决方案
针对你的需求,有两种更简洁高效的实现方式,无需手动循环:
方法1:转为密集数组后用reshape+sum(适合小规模矩阵)
如果你的稀疏矩阵规模不大,转为密集数组后可以用numpy的reshape和sum一步完成列分组求和:
import numpy as np # 先转为密集数组 dense_arr = v.toarray() # 将数组重塑为(3, 2, 2),然后沿最后一个维度求和 result = dense_arr.reshape(3, 2, 2).sum(axis=2)
执行后result就是你要的(3,2)矩阵:
array([[3, 4], [3, 1], [10, 14]])
方法2:直接操作稀疏COO矩阵(适合大规模稀疏矩阵)
如果矩阵规模很大,转为密集数组会占用过多内存,可以直接基于COO矩阵的row、col、data属性处理,避免转换为密集数组:
from scipy.sparse import coo_matrix # 定义列映射规则:原列0→0,2→0;原列1→1,3→1 col_map = {0: 0, 1: 1, 2: 0, 3: 1} new_col = np.array([col_map[c] for c in v.col]) # 构建新的COO矩阵并合并重复索引的元素 result_sparse = coo_matrix((v.data, (v.row, new_col)), shape=(3, 2)) # 合并重复位置的求和(COO矩阵允许重复索引,需要手动合并) result_sparse.sum_duplicates() # 如果需要转为密集数组查看结果,执行: # result_sparse.toarray()
这种方法全程保持稀疏矩阵格式,内存效率更高。
内容的提问来源于stack exchange,提问作者mp252
相关产品推荐
相关产品推荐

