python——稀疏矩阵scipy.sparse

本文详细介绍了Python中Scipy库的稀疏矩阵,包括coo_matrix、dok_matrix、lil_matrix、dia_matrix、csc_matrix、csr_matrix和bsr_matrix等七种类型的稀疏矩阵,以及它们的特点、优缺点和创建方式。此外,还提到了稀疏矩阵的常用函数,如eye、identity、diags、block_diag、bmat、vstack和hstack等。

导入方式

import scipy.sparse as sp

一、稀疏矩阵的种类
1.coo_matrix
最简单的存储方式,分别用row、col、val三个数组存储矩阵非零元素的行下标,列下标与值。
不能用下标索引访问元素
coo_matrix无法对矩阵的元素进行增删改等操作,一旦创建之后,除了将之转换成其它格式的矩阵,几乎无法对其做任何操作和矩阵运算。
1)属性Attributes:
dtype:矩阵的数据类型
shape:矩阵的形状
ndim:矩阵的维度,总是为2
nnz:矩阵中存储的值的个数
data:矩阵非零元素的值
row:矩阵非零元素的行下标数组
col:矩阵非零元素的列下标数组
2)创建方式
coo_matrix(D):将密集矩阵D转成coo_matrix稀疏矩阵
coo_matrix(S):将别的格式的稀疏矩阵S转成coo_matrix稀疏矩阵
coo_matrix((M, N), [dtype]):生成形状为(M, N)的指定数据类型dtype的coo_matrix稀疏矩阵

A = sp.coo_matrix((3, 4), dtype=np.int8)
B = A.toarray()   #将稀疏矩阵对象转为NumPy的array
print("A =",A)
print("B =",B)

coo_matrix((data, (row,col)), [shape=(M, N)])

row  = np.array([0, 3, 1, 0])
col  = np.array([0, 3, 1, 2])
data = np.array([4, 5, 7, 9])
A = sp.coo_matrix((data, (row, col)), shape=(4, 4))
B = A.toarray()   #将稀疏矩阵对象转为NumPy的array
print("A =",A)
print("B =",B)
print("A.data =",A.data)
print("A.data的数据类为:",type(A.data))

优点:稀疏格式之间的快速转换,允许重复条目,与CSR/CSC格式间可以非常快速地进行转换
缺点:不允许算术操作和切片

2.dok_matrix
这是一种逐渐增加稀疏矩阵中的元素的有效结构。
将非零值保存在字典,非零值的坐标元组作为字典的键。
构造简单,可快速添加删除元素,但不方便进行数学运算。
dok_matrix(D):将密集矩阵D转成dok_matrix稀疏矩阵
dok_matrix(S):将别的格式的稀疏矩阵S转成dok_matrix稀疏矩阵
dok_matrix((M,N), [dtype]):生成形状为(M, N)的指定数据类型dtype的dok_matrix稀疏矩阵

A = sp.dok_matrix((5, 5), dtype=np.float32)
for i in range(5):
    for j in range(5):
        A[i, j] = i + j    # 更新元素
B = A.toarray()   #将稀疏矩阵对象转为NumPy的array
print("A =",A)
print("B =",B)

优点:对于递增的构建稀疏矩阵很高效,比如定义该矩阵后,想进行每行每列更新值,可用该矩阵。当访问某个单元,只需要O(1)
缺点:不允许重复索引(coo中适用),但可以很高效的转换成coo后进行重复索引

3.lil_matrix
这是一种逐渐增加稀疏矩阵中的元素的有效结构。
将每行的非零元素的列索引保存在一个列表,将对应值保存在另一个列表。
支持切片操作,但不方便进行数学运算。
lil_matrix(D):将密集矩阵D转成lil_matrix稀疏矩阵
lil_matrix(S):将别的格式的稀疏矩阵S转成lil_matrix稀疏矩阵
lil_matrix((M,N), [dtype]):生成形状为(M, N)的指定数据类型dtype的lil_matrix稀疏矩阵

A = sp.lil_matrix((4, 4))
A[0, 2] = 1
A[1, 1] = 2
A[2, 0] = 3
A[2, 3] = 4
A[3, 2] = 5
B = A.toarray()   #将稀疏矩阵对象转为NumPy的array
print("A =",A)
print("B =",B<
<think>我们正在处理用户的问题:如何使用scipy.sparse库创建一维稀疏矩阵的示例。 注意:在scipy.sparse中,矩阵通常是二维的。但是,用户要求创建一维稀疏矩阵。实际上,一维数组在SciPy稀疏矩阵中通常被视为行向量(1行n列)或列向量(n行1列)。 因此,我们可以创建行向量或列向量形式的稀疏矩阵。 引用[1]提到scipy.sparse库提供了多种稀疏矩阵格式,并支持算术运算。 常见的稀疏矩阵格式有: - csr_matrix: 压缩稀疏行矩阵 - csc_matrix: 压缩稀疏列矩阵 - coo_matrix: 坐标格式矩阵 创建一维稀疏矩阵(即向量)的示例: 我们可以创建一个1行n列的行向量(使用csr_matrix或csc_matrix)或n行1列的列向量。 步骤: 1. 导入必要的模块 2. 准备数据:非零数据、索引(行索引和列索引) 3. 使用稀疏矩阵的构造函数创建 示例1:创建行向量(1行,n列) 例如,创建一个长度为5的行向量,其中位置1和3有非零值(分别为1和2)。 示例2:创建列向量(n行,1列) 例如,创建一个长度为5的列向量,其中位置1和3有非零值(分别为1和2)。 注意:在创建时,行向量可以看作是1行多列,列向量是多行1列。 我们将使用csr_matrix和csc_matrix来分别创建行向量和列向量。 另外,我们也可以使用coo_matrix来创建,然后转换成csr或csc格式。 参考引用[1]中提到的,稀疏矩阵支持算术操作,因此创建后可以进行各种运算。 下面给出两个示例代码: 示例1:创建行向量(使用csr_matrix) 示例2:创建列向量(使用csc_matrix) 同时,我们也可以使用coo_matrix创建,再转换。 注意:用户要求的是“一维”稀疏矩阵,但在稀疏矩阵中,一维向量实际上是用二维矩阵表示的(其中一维为1)。 因此,在创建时,我们需要注意形状(shape)的设置:行向量为(1, n),列向量为(n, 1)。 代码示例:</think>### 使用 SciPy.sparse 创建一维稀疏矩阵示例 在 SciPy.sparse 中,一维稀疏矩阵通常表示为 **行向量(1×n)** 或 **列向量(n×1)**。以下是创建一维稀疏矩阵的两种常用方法: #### 方法 1:使用 `csr_matrix` 创建行向量 ```python from scipy.sparse import csr_matrix # 创建一维行向量 (1×5) data = [1, 2, 3] # 非零元素值 indices = [0, 2, 4] # 非零元素的列索引 indptr = [0, 3] # 行指针(行向量固定为 [0, 非零元素数]) sparse_row = csr_matrix((data, indices, indptr), shape=(1, 5)) print(sparse_row.toarray()) # 输出: [[1 0 2 0 3]] ``` #### 方法 2:使用 `csc_matrix` 创建列向量 ```python from scipy.sparse import csc_matrix # 创建一维列向量 (5×1) data = [4, 5, 6] # 非零元素值 indices = [1, 3, 4] # 非零元素的行索引 indptr = [0, 0, 1, 2, 3, 3] # 列指针(首元素固定为0) sparse_col = csc_matrix((data, indices, indptr), shape=(5, 1)) print(sparse_col.toarray()) # 输出: # [[0] # [4] # [0] # [5] # [6]] ``` #### 关键说明: 1. **格式选择**: - 行向量推荐 `csr_matrix`(压缩稀疏行) - 列向量推荐 `csc_matrix`(压缩稀疏列) 2. **参数含义**: - `data`:非零元素值列表 - `indices`:非零元素的位置索引(行向量为列索引,列向量为行索引) - `indptr`:索引指针数组(定义行/列的起始位置) 3. **内存效率**: 对于包含 $k$ 个非零元素的 $n$ 维向量,内存占用仅为 $O(k)$ 而非 $O(n)$[^1]。 #### 操作示例: ```python # 向量点积计算 dot_product = sparse_row.dot(sparse_col) print(f"点积结果: {dot_product[0,0]}") # 输出: 0*0 + 1*4 + 0*0 + 2*5 + 3*6 = 32 ``` > ⚠️ 注意:所有 SciPy 稀疏矩阵本质是二维对象。一维操作需通过 `shape=(1,n)` 或 `shape=(n,1)` 显式定义维度[^1]。 --- ### 相关问题 1. 如何高效计算两个稀疏向量的点积? 2. `csr_matrix` 和 `csc_matrix` 在存储结构上有哪些区别? 3. 如何将一维稀疏矩阵转换为密集的 NumPy 数组? 4. 在哪些场景下使用稀疏矩阵比密集矩阵更有优势? [^1]: scipy.sparse 库支持多种稀疏矩阵格式和算术操作,包括加、减、乘、除和矩阵幂运算。 [^2]: 稀疏矩阵的索引结构优化可显著提升计算效率。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值