导入方式
import scipy.sparse as sp
一、稀疏矩阵的种类
1.coo_matrix
最简单的存储方式,分别用row、col、val三个数组存储矩阵非零元素的行下标,列下标与值。
不能用下标索引访问元素
coo_matrix无法对矩阵的元素进行增删改等操作,一旦创建之后,除了将之转换成其它格式的矩阵,几乎无法对其做任何操作和矩阵运算。
1)属性Attributes:
dtype:矩阵的数据类型
shape:矩阵的形状
ndim:矩阵的维度,总是为2
nnz:矩阵中存储的值的个数
data:矩阵非零元素的值
row:矩阵非零元素的行下标数组
col:矩阵非零元素的列下标数组
2)创建方式
coo_matrix(D):将密集矩阵D转成coo_matrix稀疏矩阵
coo_matrix(S):将别的格式的稀疏矩阵S转成coo_matrix稀疏矩阵
coo_matrix((M, N), [dtype]):生成形状为(M, N)的指定数据类型dtype的coo_matrix稀疏矩阵
A = sp.coo_matrix((3, 4), dtype=np.int8)
B = A.toarray() #将稀疏矩阵对象转为NumPy的array
print("A =",A)
print("B =",B)
coo_matrix((data, (row,col)), [shape=(M, N)])
row = np.array([0, 3, 1, 0])
col = np.array([0, 3, 1, 2])
data = np.array([4, 5, 7, 9])
A = sp.coo_matrix((data, (row, col)), shape=(4, 4))
B = A.toarray() #将稀疏矩阵对象转为NumPy的array
print("A =",A)
print("B =",B)
print("A.data =",A.data)
print("A.data的数据类为:",type(A.data))
优点:稀疏格式之间的快速转换,允许重复条目,与CSR/CSC格式间可以非常快速地进行转换
缺点:不允许算术操作和切片
2.dok_matrix
这是一种逐渐增加稀疏矩阵中的元素的有效结构。
将非零值保存在字典,非零值的坐标元组作为字典的键。
构造简单,可快速添加删除元素,但不方便进行数学运算。
dok_matrix(D):将密集矩阵D转成dok_matrix稀疏矩阵
dok_matrix(S):将别的格式的稀疏矩阵S转成dok_matrix稀疏矩阵
dok_matrix((M,N), [dtype]):生成形状为(M, N)的指定数据类型dtype的dok_matrix稀疏矩阵
A = sp.dok_matrix((5, 5), dtype=np.float32)
for i in range(5):
for j in range(5):
A[i, j] = i + j # 更新元素
B = A.toarray() #将稀疏矩阵对象转为NumPy的array
print("A =",A)
print("B =",B)
优点:对于递增的构建稀疏矩阵很高效,比如定义该矩阵后,想进行每行每列更新值,可用该矩阵。当访问某个单元,只需要O(1)
缺点:不允许重复索引(coo中适用),但可以很高效的转换成coo后进行重复索引
3.lil_matrix
这是一种逐渐增加稀疏矩阵中的元素的有效结构。
将每行的非零元素的列索引保存在一个列表,将对应值保存在另一个列表。
支持切片操作,但不方便进行数学运算。
lil_matrix(D):将密集矩阵D转成lil_matrix稀疏矩阵
lil_matrix(S):将别的格式的稀疏矩阵S转成lil_matrix稀疏矩阵
lil_matrix((M,N), [dtype]):生成形状为(M, N)的指定数据类型dtype的lil_matrix稀疏矩阵
A = sp.lil_matrix((4, 4))
A[0, 2] = 1
A[1, 1] = 2
A[2, 0] = 3
A[2, 3] = 4
A[3, 2] = 5
B = A.toarray() #将稀疏矩阵对象转为NumPy的array
print("A =",A)