稀疏矩阵 (scipy.sparse)#

SciPy 2-D 稀疏数组包,用于数值数据。

注意

此包正在从旧的矩阵界面切换为与 NumPy 数组兼容的数组界面。我们建议你对所有新工作使用数组对象 (bsr_arraycoo_array,等等)。

在使用数组界面时,请注意

  • x * y 不再执行矩阵乘法,而是逐元素乘法(与 NumPy 数组完全相同)。要使代码在数组和矩阵中同时工作,请对矩阵乘法使用 x @ y

  • 以前生成稠密矩阵的操作(如 sum)现在生成数组,其乘法行为同样不同。

  • 稀疏数组目前必须为二维。这也意味着对这些对象的所有切片操作都必须生成二维结果,否则将导致错误。此问题将在未来版本中解决。

构造实用程序(eyekronrandomdiags 等)尚未移植,但其结果可以封装到数组中

A = csr_array(eye(3))

内容#

稀疏数组类#

bsr_array(arg1[, shape, dtype, copy, blocksize])

稀疏行格式块稀疏数组。

coo_array(arg1[, shape, dtype, copy])

COOrdinate 格式的稀疏数组。

csc_array(arg1[, shape, dtype, copy])

压缩稀疏行数组。

csr_array(arg1[, shape, dtype, copy])

压缩稀疏行数组。

dia_array(arg1[, shape, dtype, copy])

具有 DIAgonal 存储的稀疏数组。

dok_array(arg1[, shape, dtype, copy])

基于键的字典表示的稀疏数组。

lil_array(arg1[, shape, dtype, copy])

基于行的列表列表表示的稀疏数组。

sparray()

此类为所有稀疏数组提供基类。

稀疏矩阵类#

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

稀疏行格式块稀疏矩阵。

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

COOrdinate 格式的稀疏矩阵。

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

Compressed Sparse Column matrix.

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

压缩稀疏行矩阵。

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

带 DIAgonal 存储的稀疏矩阵。

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

基于键的稀疏矩阵的词典。

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

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

spmatrix()

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

函数#

构建稀疏数组

diags_array(diagonals, /, *[, offsets, ...])

利用对角线构建稀疏数组。

eye_array(m[, n, k, dtype, format])

稀疏数组格式的单位矩阵

random_array(shape, *[, density, format, ...])

返回一个均匀随机数稀疏数组,介于 [0, 1)

block_array(blocks, *[, format, dtype])

从稀疏子块构建一个稀疏数组

构建稀疏矩阵

eye(m[, n, k, dtype, format])

对角线上有元素的稀疏矩阵

identity(n[, dtype, format])

稀疏格式中的单位矩阵

diags(diagonals[, offsets, shape, format, dtype])

利用对角线构建一个稀疏矩阵。

spdiags(data, 对角线[, m, n, 格式])

根据对角线返回稀疏矩阵。

bmat(块[, 格式, 数据类型])

根据稀疏子模块构建稀疏数组或矩阵

random(m, n[, 密度, 格式, 数据类型, ...])

生成指定形状和密度的稀疏矩阵,其中值随机分布。

rand(m, n[, 密度, 格式, 数据类型, ...])

生成指定形状和密度的稀疏矩阵,其中值均匀分布。

从更小的结构中构建更大的结构(数组或矩阵)

kron(A, B[, 格式])

稀疏矩阵 A 和 B 的克罗内克积

kronsum(A, B[, 格式])

平方稀疏矩阵 A 和 B 的克罗内克和

block_diag(垫子[, 格式, 数据类型])

根据提供的矩阵构建块对角稀疏矩阵或数组。

tril(A[, k, 格式])

返回稀疏数组或矩阵的下三角部分

triu(A[, k, 格式])

返回稀疏数组或矩阵的上三角部分

hstack(块[, 格式, 数据类型])

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

vstack(块[, 格式, 数据类型])

垂直(按行)堆叠稀疏数组

保存和加载稀疏矩阵

save_npz(文件, 矩阵[, 压缩])

使用 .npz 格式保存稀疏矩阵或数组到文件中。

load_npz(file)

使用 .npz 格式从文件中加载稀疏数组/矩阵。

稀疏工具

find(A)

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

识别稀疏数组

  • 使用 isinstance(A, sp.sparse.sparray) 检查数组或矩阵。

  • 使用 A.format == ‘csr’ 检查稀疏格式

识别稀疏矩阵

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_array 类型吗?

isspmatrix_coo(x)

x 是 coo_matrix 类型吗?

isspmatrix_dia(x)

x 是 dia_matrix 类型吗?

子模块#

csgraph

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

linalg

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

异常#

使用信息#

有七种可用的稀疏数组类型

  1. csc_array: 压缩稀疏列格式

  2. csr_array: 压缩稀疏行格式

  3. bsr_array: 块稀疏行格式

  4. lil_array: 列表列表格式

  5. dok_array: 键字典格式

  6. coo_array: 坐标格式(又称 IJV、三元组格式)

  7. dia_array: 对角线格式

若要高效构建数组,请使用 dok_arraylil_arraylil_array 类支持使用与 NumPy 数组类似的语法进行基本切片和花式索引。如下所示,COO 格式也可以用于高效构建数组。尽管它们与 NumPy 数组类似,但 **强烈建议** 不要直接在这些数组上使用 NumPy 函数,因为 NumPy 可能无法正确转换它们以进行计算,从而导致意外(且不正确)的结果。如果你确实想对这些数组应用 NumPy 函数,请先检查 SciPy 是否对给定的稀疏数组类有自己的实现,或在应用该方法之前先 **将稀疏数组转换为 NumPy 数组**(例如,使用该类的 toarray 方法)。

若要执行乘法或求逆等操作,请首先将数组转换为 CSC 或 CSR 格式。 lil_array 格式是基于行的,因此转换为 CSR 很高效,而转换为 CSC 则效率较低。

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

矩阵向量乘积#

若要在稀疏数组和向量之间做向量乘积,只需使用数组 dot 方法,如其文档字符串中所述

>>> import numpy as np
>>> from scipy.sparse import csr_array
>>> A = csr_array([[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_array 并向其添加一些值

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

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

>>> 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_array((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_array((V,(I,J)),shape=(4,4)).tocsr()

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

详细信息#

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