稀疏数组 (scipy.sparse
)#
用于数值数据的 SciPy 二维稀疏数组包。
注意
此包正在从旧的矩阵接口切换到与 NumPy 数组兼容的数组接口。我们建议您对所有新工作使用数组对象(bsr_array
、 coo_array
等)。
使用数组接口时,请注意
x * y
不再执行矩阵乘法,而是执行逐元素乘法(就像使用 NumPy 数组一样)。 要使代码同时适用于数组和矩阵,请使用x @ y
进行矩阵乘法。诸如
sum
之类的操作,以前会产生稠密矩阵,现在会产生数组,它们的乘法行为类似地不同。稀疏数组使用数组样式的切片操作,返回标量、一维或二维稀疏数组。 如果需要二维结果,请使用适当的索引。 例如
A[:, i, None]
或A[:, [i]]
。
构造实用程序(eye
、kron
、random
、diags
等)有适当的替换(请参阅构建稀疏数组)。
有关更多信息,请参阅从 spmatrix 迁移到 sparray。
子模块#
压缩稀疏图例程 (scipy.sparse.csgraph) |
|
稀疏线性代数 (scipy.sparse.linalg) |
稀疏数组类#
|
块稀疏行格式稀疏数组。 |
|
COOrdinate 格式的稀疏数组。 |
|
压缩稀疏列数组。 |
|
压缩稀疏行数组。 |
|
具有对角存储的稀疏数组。 |
|
基于键字典的稀疏数组。 |
|
基于行的列表的列表稀疏数组。 |
|
此类为所有稀疏数组提供了一个基类。 |
构建稀疏数组#
|
从对角线构造稀疏数组。 |
|
稀疏数组格式的单位矩阵 |
|
返回 [0, 1) 中均匀随机数的稀疏数组 |
|
从稀疏子块构建稀疏数组 |
组合数组#
|
稀疏矩阵 A 和 B 的 Kronecker 积 |
|
方稀疏矩阵 A 和 B 的 Kronecker 和 |
|
从提供的矩阵构建块对角稀疏矩阵或数组。 |
|
返回稀疏数组或矩阵的下三角部分 |
|
返回稀疏数组或矩阵的上三角部分 |
|
水平(按列)堆叠稀疏矩阵 |
|
垂直(按行)堆叠稀疏数组 |
稀疏工具#
|
使用 |
|
使用 |
|
返回矩阵的非零元素的索引和值 |
|
基于输入(整数)数组 a,确定可以容纳数组中数据的合适索引数据类型。 |
|
将稀疏数组索引安全地转换为 idx_dtype。 |
识别稀疏数组#
|
x 是稀疏数组还是稀疏矩阵类型? |
稀疏矩阵类#
|
块稀疏行格式稀疏矩阵。 |
|
COOrdinate 格式的稀疏矩阵。 |
|
压缩稀疏列矩阵。 |
|
压缩稀疏行矩阵。 |
|
具有对角存储的稀疏矩阵。 |
|
基于键的字典稀疏矩阵。 |
|
基于行的列表的列表稀疏矩阵。 |
|
此类为所有稀疏矩阵类提供了一个基类。 |
构建稀疏矩阵#
|
对角线上为 1 的稀疏矩阵 |
|
稀疏格式的单位矩阵 |
|
从对角线构造稀疏矩阵。 |
|
从对角线返回一个稀疏矩阵。 |
|
从稀疏子块构建稀疏数组或矩阵 |
|
生成一个具有给定形状和密度的稀疏矩阵,其中值随机分布。 |
|
生成一个具有给定形状和密度的稀疏矩阵,其中值均匀分布。 |
合并矩阵使用与 合并数组相同的函数。
识别稀疏矩阵#
|
x 是稀疏数组还是稀疏矩阵类型? |
|
x 是稀疏矩阵类型吗? |
x 是 csc_matrix 类型吗? |
|
x 是 csr_matrix 类型吗? |
|
x 是 bsr_matrix 类型吗? |
|
x 是 lil_matrix 类型吗? |
|
x 是 dok_array 类型吗? |
|
x 是 coo_matrix 类型吗? |
|
x 是 dia_matrix 类型吗? |
警告#
使用信息#
有七种可用的稀疏数组类型
csc_array:压缩稀疏列格式
csr_array:压缩稀疏行格式
bsr_array:块稀疏行格式
lil_array:列表的列表格式
dok_array:键的字典格式
coo_array:坐标格式(又名 IJV,三元组格式)
dia_array:对角线格式
要高效地构造数组,请使用 coo_array
、dok_array
或 lil_array
中的任何一个。dok_array
和 lil_array
支持基本的切片和花式索引,其语法与 NumPy 数组类似。COO 格式尚不支持索引(但)也可以使用坐标和值信息来高效地构造数组。
尽管它们与 NumPy 数组相似,但强烈不建议直接在这些数组上使用 NumPy 函数,因为 NumPy 通常将它们视为通用的 Python 对象而不是数组,从而导致意外(和不正确)的结果。如果您确实想将 NumPy 函数应用于这些数组,请首先检查 SciPy 是否针对给定的稀疏数组类有自己的实现,或者在应用该方法之前将稀疏数组转换为 NumPy 数组(例如,使用该类的 toarray 方法)。
CSR、CSC 和 COO 格式之间的所有转换都是高效的线性时间操作。
要执行诸如乘法或求逆之类的操作,请首先将数组转换为 CSC 或 CSR 格式。lil_array
格式是基于行的,因此转换为 CSR 是高效的,而转换为 CSC 则效率较低。
矩阵向量积#
要在 2D 稀疏数组和向量之间进行向量积,请使用 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-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()
方法。