csr_matrix(Compressed Sparse Row matrix)存储模式 ---稀疏数据的压缩

本文介绍压缩稀疏矩阵(CSR)存储方式,并通过具体示例解释如何使用numpy数组表示CSR矩阵及其转换过程。详细解析了indptr、indices及data参数的作用。

压缩稀疏矩阵的某种存储方式

>>> indptr = np.array([0, 2, 3, 6])
>>> indices = np.array([0, 2, 2, 0, 1, 2])
>>> data = np.array([1, 2, 3, 4, 5, 6])
>>> csr_matrix((data, indices, indptr), shape=(3, 3)).toarray()
array([[1, 0, 2],
       [0, 0, 3],
       [4, 5, 6]])

data 表示 元数据 显然为1, 2, 3, 4, 5, 6

shape 表示 矩阵的形状 为 3 * 3

indices 表示 各个数据在各行的下标, 从该数据我们可以知道:数据1在某行的0位置处, 数据2在某行的2位置处,6在某行的2位置处。

而各个数据在哪一行就要通过indptr参数得到的

indptr 表示每行数据的个数:[0 2 3 6]表示从第0行开始数据的个数,0表示默认起始点,0之后有几个数字就表示有几行,第一个数字2表示第一行有2 - 0 = 2个数字,因而数字1,2都第0行,第二行有3 - 2 = 1个数字,因而数字3在第1行,以此类推,我们能够知道所有数字的行号

转载:https://blog.youkuaiyun.com/u013487140/article/details/52203411

<think>嗯,用户想了解scipy.sparse.csr_matrix的使用方法和功能。我需要先回忆一下csr_matrix的基本概念。CSR压缩稀疏行格式,适用于稀疏矩阵的高效存储和计算。首先得解释它的优势,比如内存占用小,运算速度快。接下来,用户可能需要具体的构造方法。记得构造csr_matrix通常有三种方式:通过数据、行列索引和indptr数组;或者通过密集矩阵转换;以及通过COO格式转换。需要分别举例说明,尤其是第一种方法,因为indptr和indices可能比较难理解。比如引用中的例子,indptr数组表示每行的起始和结束位置,indices是列索引,data是数值。这时候要详细说明这些参数的关系,可能还要用代码示例来展示。然后,功能部分需要提到它的数学运算,比如矩阵乘法、转置,以及和机器学习框架的兼容性,比如sklearn。这些应用场景对用户可能很有帮助。另外,内存效率和快速行切片的特点也要强调,比如在自然语言处理中的使用例子。 用户可能还会关心如何正确使用各个参数,避免出错。比如indptr的长度是行数加一,indices和data的长度必须一致。这些注意事项能帮助用户避免常见的错误。最后,相关问题部分要考虑用户可能的后续需求,比如构造方法的不同、与其他格式的比较、性能优势和应用场景。这些问题的设置能引导用户进一步深入学习,解决实际问题。需要确保问题覆盖了用户可能感兴趣的方向,同时结合引用中的其他稀疏矩阵类型,如lil_matrix,来扩展相关问题。</think>### `scipy.sparse.csr_matrix` 功能与使用方法 #### 1. **核心功能** - **稀疏矩阵高效存储**:压缩稀疏行(Compressed Sparse Row)格式,适合存储非零元素较少的矩阵,内存占用显著低于稠密矩阵[^1]。 - **快速数学运算**:支持矩阵乘法、转置、切片等操作,尤其擅长行切片[^4]。 - **兼容性**:与NumPy、SciPy及机器学习库(如scikit-learn)无缝集成。 #### 2. **构造方法** ##### 方法1:通过`(data, indices, indptr)`三元组 ```python import numpy as np from scipy.sparse import csr_matrix # 定义三元组参数 indptr = np.array([0, 2, 3, 6]) # 行指针,长度=行数+1 indices = np.array([0, 2, 2, 0, 1, 2]) # 列索引 data = np.array([1, 2, 3, 4, 5, 6]) # 非零值 matrix = csr_matrix((data, indices, indptr), shape=(3, 3)) print(matrix.toarray()) # 输出: # [[1 0 2] # [0 0 3] # [4 5 6]] ``` - **参数解释**: - `indptr[i]:indptr[i+1]`表示第`i`行的非零元素在`data`和`indices`中的区间[^2]。 - `indices`存储列索引,`data`存储对应非零值[^4]。 ##### 方法2:通过稠密矩阵转换 ```python dense_matrix = np.array([[0, 0, 1], [2, 0, 0], [0, 3, 0]]) csr_from_dense = csr_matrix(dense_matrix) ``` ##### 方法3:通过COO格式转换 ```python from scipy.sparse import coo_matrix coo = coo_matrix(([1,2,3], ([0,1,2], [2,0,1])), shape=(3,3)) csr_from_coo = coo.tocsr() ``` #### 3. **关键操作** - **数学运算**: ```python matrix_T = matrix.transpose() # 转置 product = matrix.dot(matrix_T) # 矩阵乘法 ``` - **数据访问**: ```python row_slice = matrix[1, :] # 快速获取第1行 nonzero_entries = matrix.data # 获取所有非零值 ``` #### 4. **应用场景** - **自然语言处理**:存储词袋模型(Bag-of-Words)的特征矩阵。 - **推荐系统**:表示用户-物品交互矩阵。 - **科学计算**:求解偏微分方程时的稀疏系数矩阵。 #### 5. **注意事项** - **参数一致性**:`indices`和`data`长度必须相同,`indptr`长度应为行数+1[^4]。 - **修改效率**:频繁修改矩阵时建议先用`lil_matrix`构造,再转为`csr_matrix`[^5]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值