如何基于标记每列1的行索引的元组列表高效生成稀疏矩阵
元组列表转稀疏矩阵解决方案
核心思路:利用scipy的稀疏矩阵构造接口,直接提取所有值为1的坐标点构造矩阵,全程无Python层面的显式for循环,执行效率极高。
需要提前安装numpy、scipy依赖库。
代码实现
import numpy as np from scipy.sparse import coo_matrix def generate_sparse_matrix(list_tuples, array_shape=None): # 自动计算矩阵列数 col_count = len(list_tuples) # 未指定shape时自动推导行数 if array_shape is None: max_row = max(idx for tup in list_tuples for idx in tup) row_count = max_row + 1 array_shape = (row_count, col_count) # 提取所有值为1的行索引 rows = np.concatenate(list_tuples) # 提取所有值为1的列索引:第i个元组对应第i列 cols = np.repeat(np.arange(col_count), [len(t) for t in list_tuples]) # 所有非零值均为1 data = np.ones(len(rows), dtype=np.int8) # 构造稀疏矩阵 sparse_mat = coo_matrix((data, (rows, cols)), shape=array_shape) return sparse_mat
示例调用
# 示例输入 list_tuples = [ (0, 2, 4), (0, 2, 3), (1, 3, 4) ] m = 5 n = len(list_tuples) A = generate_sparse_matrix(list_tuples, array_shape=(m, n)) # 转成稠密数组查看结果 print(A.toarray())
输出结果
[[1 1 0] [0 0 1] [1 1 0] [0 1 1] [1 0 1]]
补充说明
- 如果不需要转换成稠密数组,直接使用返回的coo_matrix对象即可,也可以根据使用场景转成CSR/CSC等其他稀疏矩阵格式,方便后续矩阵运算。
- 所有核心操作都是numpy底层C实现,没有Python级别的for循环,哪怕输入的元组列表规模很大也能高效处理。
内容的提问来源于stack exchange,提问作者Roman velez jimenez
相关产品推荐
相关产品推荐

