稀疏矩阵 (scipy.sparse )

适用于数字数据的SciPy二维稀疏矩阵软件包。

目录

稀疏矩阵类

bsr_matrix \(arg1[, shape, dtype, copy, blocksize] )

挡路稀疏行阵

coo_matrix \(arg1[, shape, dtype, copy] )

坐标格式的稀疏矩阵。

csc_matrix \(arg1[, shape, dtype, copy] )

压缩稀疏列矩阵

csr_matrix \(arg1[, shape, dtype, copy] )

压缩稀疏行矩阵

dia_matrix \(arg1[, shape, dtype, copy] )

具有对角存储的稀疏矩阵

dok_matrix \(arg1[, shape, dtype, copy] )

基于稀疏矩阵的键字典。

lil_matrix \(arg1[, shape, dtype, copy] )

基于行的列表稀疏矩阵列表

spmatrix \([maxprint] )

此类为所有稀疏矩阵提供基类。

功能

构建稀疏矩阵:

eye \(M[, n, k, dtype, format] )

对角线上的稀疏矩阵

identity \(n[, dtype, format] )

稀疏格式单位矩阵

kron \(A,B[, format] )

稀疏矩阵A和B的Kronecker积

kronsum \(A,B[, format] )

稀疏矩阵A和B的Kronecker和

diags \(对角线[, offsets, shape, format, dtype] )

由对角线构造一个稀疏矩阵。

spdiags \(数据,诊断,m,n[, format] )

从对角线返回稀疏矩阵。

block_diag \(垫子[, format, dtype] )

从提供的矩阵构建挡路对角稀疏矩阵。

tril \(a[, k, format] )

以稀疏格式返回矩阵的下三角部分

triu \(a[, k, format] )

以稀疏格式返回矩阵的上三角部分

bmat \(数据块[, format, dtype] )

从稀疏子块构建稀疏矩阵

hstack \(数据块[, format, dtype] )

水平堆叠稀疏矩阵(按列)

vstack \(数据块[, format, dtype] )

垂直堆叠稀疏矩阵(按行)

rand \(M,n[, density, format, dtype, ...] )

生成具有均匀分布值的给定形状和密度的稀疏矩阵。

random \(M,n[, density, format, dtype, ...] )

生成具有随机分布值的给定形状和密度的稀疏矩阵。

保存和加载稀疏矩阵:

save_npz \(文件,矩阵[, compressed] )

使用将稀疏矩阵保存到文件 .npz 格式化。

load_npz \(文件)

使用从文件加载稀疏矩阵 .npz 格式化。

稀疏矩阵工具:

find \(a)

返回矩阵的非零元素的索引和值

识别稀疏矩阵:

issparse \(X)

x是稀疏矩阵类型吗?

isspmatrix \(X)

x是稀疏矩阵类型吗?

isspmatrix_csc \(X)

x是否为CSC_MATRIX类型?

isspmatrix_csr \(X)

x是否为CSR_MATRIX类型?

isspmatrix_bsr \(X)

x是否为BSR_MATRIX类型?

isspmatrix_lil \(X)

x是否为lil_Matrix类型?

isspmatrix_dok \(X)

x是否为dok_Matrix类型?

isspmatrix_coo \(X)

x是否为coo_Matrix类型?

isspmatrix_dia \(X)

x是否为直径矩阵类型?

子模块

csgraph 

压缩稀疏图形例程(scipy.parse.csgraph)

linalg 

稀疏线性代数(scipy.parse.linalg)

例外情况

SparseEfficiencyWarning 

SparseWarning 

使用信息

有七种可用的稀疏矩阵类型:

  1. CSC_MATRIX:压缩稀疏列格式

  2. CSR_MATRIX:压缩稀疏行格式

  3. bsr_Matrix:挡路稀疏行格式

  4. LIL_MATRIX:列表列表格式

  5. DOK_MATRIX:密钥字典格式

  6. COO_MATRIX:坐标格式(也称为IJV,三元组格式)

  7. DIA_MATRIX:对角线格式

要有效地构造矩阵,请使用dok_Matrix或lil_Matrix。lil_Matrix类使用与NumPy数组相似的语法支持基本切片和特殊索引。如下所示,COO格式还可用于有效地构造矩阵。尽管它们与NumPy数组相似,但它 强烈气馁 直接对这些矩阵使用NumPy函数,因为NumPy可能无法正确转换它们进行计算,从而导致意外(和不正确的)结果。如果您确实想要将NumPy函数应用于这些矩阵,请首先检查对于给定的稀疏矩阵类,SciPy是否有自己的实现,或者 将稀疏矩阵转换为NumPy数组 (例如,使用 toarray() 方法),然后再应用该方法。

要执行乘法或求逆等操作,请首先将矩阵转换为CSC或CSR格式。lil_Matrix格式是基于行的,因此向CSR的转换效率较高,而向CSC的转换效率较低。

CSR、CSC和COO格式之间的所有转换都是高效的线性时间操作。

矩阵向量积

要在稀疏矩阵和向量之间进行向量乘积,只需使用矩阵 dot 方法,如其文档字符串中所述:

>>> import numpy as np
>>> from scipy.sparse import csr_matrix
>>> A = csr_matrix([[1, 2, 0], [0, 0, 3], [4, 0, 5]])
>>> v = np.array([1, 0, -1])
>>> A.dot(v)
array([ 1, -3, -1], dtype=int64)

警告

从NumPy 1.7开始, np.dot 不知道稀疏矩阵,因此使用它会导致意外的结果或错误。应该先获取对应的密集数组:

>>> np.dot(A.toarray(), v)
array([ 1, -3, -1], dtype=int64)

但那样就会失去所有的性能优势。

CSR格式特别适用于快速矩阵矢量积。

示例1

构造1000x1000 lil_Matrix并向其添加一些值:

>>> from scipy.sparse import lil_matrix
>>> from scipy.sparse.linalg import spsolve
>>> from numpy.linalg import solve, norm
>>> from numpy.random import rand
>>> A = lil_matrix((1000, 1000))
>>> A[0, :100] = rand(100)
>>> A[1, 100:200] = A[0, :100]
>>> A.setdiag(rand(1000))

现在将其转换为CSR格式,并求解x的Ax=b:

>>> A = A.tocsr()
>>> b = rand(1000)
>>> x = spsolve(A, b)

将其转换为密集矩阵并求解,并检查结果是否相同:

>>> x_ = solve(A.toarray(), b)

现在我们可以用以下公式计算误差的范数:

>>> err = norm(x-x_)
>>> err < 1e-10
True

它应该很小:)

示例2

构建COO格式的矩阵:

>>> from scipy import sparse
>>> from numpy import array
>>> I = array([0,3,1,0])
>>> J = array([0,3,1,2])
>>> V = array([4,5,7,9])
>>> A = sparse.coo_matrix((V,(I,J)),shape=(4,4))

请注意,索引不需要排序。

当转换为CSR或CSC时,对重复的(i,j)个条目求和。

>>> I = array([0,0,1,3,1,0,0])
>>> J = array([0,2,1,3,1,0,0])
>>> V = array([1,1,1,1,1,1,1])
>>> B = sparse.coo_matrix((V,(I,J)),shape=(4,4)).tocsr()

这对于构造有限元刚度矩阵和质量矩阵很有用。

更多细节

CSR列索引不一定要排序。CSC行索引也是如此。当需要排序索引时(例如,将数据传递到其他库时),请使用.sorted_index()和.ort_index()方法。