稀疏矩阵 (scipy.sparse
)¶
适用于数字数据的SciPy二维稀疏矩阵软件包。
目录¶
稀疏矩阵类¶
|
挡路稀疏行阵 |
|
坐标格式的稀疏矩阵。 |
|
压缩稀疏列矩阵 |
|
压缩稀疏行矩阵 |
|
具有对角存储的稀疏矩阵 |
|
基于稀疏矩阵的键字典。 |
|
基于行的列表稀疏矩阵列表 |
|
此类为所有稀疏矩阵提供基类。 |
功能¶
构建稀疏矩阵:
|
对角线上的稀疏矩阵 |
|
稀疏格式单位矩阵 |
|
稀疏矩阵A和B的Kronecker积 |
|
稀疏矩阵A和B的Kronecker和 |
|
由对角线构造一个稀疏矩阵。 |
|
从对角线返回稀疏矩阵。 |
|
从提供的矩阵构建挡路对角稀疏矩阵。 |
|
以稀疏格式返回矩阵的下三角部分 |
|
以稀疏格式返回矩阵的上三角部分 |
|
从稀疏子块构建稀疏矩阵 |
|
水平堆叠稀疏矩阵(按列) |
|
垂直堆叠稀疏矩阵(按行) |
|
生成具有均匀分布值的给定形状和密度的稀疏矩阵。 |
|
生成具有随机分布值的给定形状和密度的稀疏矩阵。 |
保存和加载稀疏矩阵:
|
使用将稀疏矩阵保存到文件 |
|
使用从文件加载稀疏矩阵 |
稀疏矩阵工具:
|
返回矩阵的非零元素的索引和值 |
识别稀疏矩阵:
|
x是稀疏矩阵类型吗? |
|
x是稀疏矩阵类型吗? |
|
x是否为CSC_MATRIX类型? |
|
x是否为CSR_MATRIX类型? |
|
x是否为BSR_MATRIX类型? |
|
x是否为lil_Matrix类型? |
|
x是否为dok_Matrix类型? |
|
x是否为coo_Matrix类型? |
|
x是否为直径矩阵类型? |
子模块¶
压缩稀疏图形例程(scipy.parse.csgraph) |
|
稀疏线性代数(scipy.parse.linalg) |
例外情况¶
使用信息¶
有七种可用的稀疏矩阵类型:
CSC_MATRIX:压缩稀疏列格式
CSR_MATRIX:压缩稀疏行格式
bsr_Matrix:挡路稀疏行格式
LIL_MATRIX:列表列表格式
DOK_MATRIX:密钥字典格式
COO_MATRIX:坐标格式(也称为IJV,三元组格式)
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()方法。