稀疏数组 (scipy.sparse)#

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

注意

此包正在从旧的矩阵接口切换到与 NumPy 数组兼容的数组接口。我们建议您在所有新工作中都使用数组对象(bsr_arraycoo_array 等)。

使用数组接口时,请注意

  • x * y 不再执行矩阵乘法,而是执行逐元素乘法(就像 NumPy 数组一样)。要使代码适用于数组和矩阵,请使用 x @ y 进行矩阵乘法。

  • 以前生成密集矩阵的 sum 等操作现在生成数组,其乘法行为也类似。

  • 稀疏数组使用数组样式切片操作,返回标量、一维或二维稀疏数组。如果您需要二维结果,请使用适当的索引。例如 A[:, i, None]A[:, [i]]

  • 给定稀疏数组的所有索引数组都应具有相同的 dtype。例如,对于 CSR 格式,indicesindptr 应具有相同的 dtype。对于 COO,coords 中的每个数组都应具有相同的 dtype。

构造实用程序(eyekronrandomdiags 等)都有适当的替代品(参见构建稀疏数组)。

更多信息请参见从 spmatrix 迁移到 sparray

子模块#

csgraph

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

linalg

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

稀疏数组类#

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

分块稀疏行格式稀疏数组。

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

COO 坐标格式的稀疏数组。

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

压缩稀疏列数组。

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

压缩稀疏行数组。

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

对角线存储的稀疏数组。

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

基于键字典的稀疏数组。

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

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

sparray()

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

构建稀疏数组#

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

从对角线构造稀疏数组。

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

给定形状的稀疏数组,第 k 个对角线上为 1,其他地方为 0。

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

返回 [0, 1) 区间内均匀随机数的稀疏数组

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

从稀疏子块构建稀疏数组

组合数组#

kron(A, B[, format])

AB 的克罗内克积的稀疏表示

kronsum(A, B[, format])

方稀疏矩阵 AB 的克罗内克和

block_diag(mats[, format, dtype])

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

tril(A[, k, format])

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

triu(A[, k, format])

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

hstack(blocks[, format, dtype])

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

vstack(blocks[, format, dtype])

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

swapaxes(A, axis1, axis2)

交换数组的两个轴。

expand_dims(A, /, *[, axis])

向数组添加琐碎的轴。

permute_dims(A[, axes, copy])

将稀疏数组 A 的轴排列成 axes 的顺序。

稀疏工具#

save_npz(file, matrix[, compressed])

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

load_npz(file)

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

find(A)

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

get_index_dtype([arrays, maxval, check_contents])

根据输入(整数)数组 a,确定适合存储数组中数据的索引数据类型。

safely_cast_index_arrays(A[, idx_dtype, msg])

安全地将稀疏数组索引转换为 idx_dtype

识别稀疏数组#

issparse(x)

x 是稀疏数组或稀疏矩阵类型吗?

稀疏矩阵类#

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

分块稀疏行格式稀疏矩阵。

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

COO 坐标格式的稀疏矩阵。

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

压缩稀疏列矩阵。

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

压缩稀疏行矩阵。

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

对角线存储的稀疏矩阵。

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

基于键字典的稀疏矩阵。

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

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

spmatrix()

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

构建稀疏矩阵#

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

给定形状的稀疏矩阵,第 k 个对角线上为 1,其他地方为 0。

identity(n[, dtype, format])

稀疏格式的单位矩阵

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

从对角线构造稀疏矩阵。

spdiags(data, diags[, m, n, format])

从对角线返回稀疏矩阵。

bmat(blocks[, format, dtype])

从稀疏子块构建稀疏数组或矩阵

random(m, n[, density, format, dtype, rng, ...])

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

rand(m, n[, density, format, dtype, rng, ...])

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

组合矩阵使用与 组合数组 相同的函数。

识别稀疏矩阵#

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

警告#

SparseEfficiencyWarning

当操作对稀疏矩阵效率低下时发出的警告。

SparseWarning

scipy.sparse 的一般警告。

用法信息#

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

  1. csc_array: 压缩稀疏列格式

  2. csr_array: 压缩稀疏行格式

  3. bsr_array: 分块稀疏行格式

  4. lil_array: 列表的列表格式

  5. dok_array: 键字典格式

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

  7. dia_array: 对角线格式

为了高效地构造数组,请使用 coo_arraydok_arraylil_array 中的任何一种。dok_arraylil_array 支持基本的切片和高级索引,语法与 NumPy 数组类似。COO 格式尚不支持索引,但也可用于使用坐标和值信息高效地构造数组。

尽管这些数组与 NumPy 数组相似,但强烈不鼓励直接在这些数组上使用 NumPy 函数,因为 NumPy 通常将它们视为通用 Python 对象而不是数组,从而导致意想不到(且不正确)的结果。如果您确实想对这些数组应用 NumPy 函数,请首先检查 SciPy 是否有其自己的给定稀疏数组类的实现,或者在应用该方法之前将稀疏数组转换为 NumPy 数组(例如,使用该类的 toarray 方法)。

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

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

矩阵向量积#

要在二维稀疏数组和向量之间进行向量积,请使用 matmul 运算符(即 @),它执行点积(类似于 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 @ 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-9
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() 方法。