基本原理
csc,即Compressed Sparse Column,是压缩稀疏列数组,就是将稀疏矩阵按列分割,并对这些列进行存储。
在稀疏矩阵中,有三个关键的编码数据,分别是data, indices
和indptr
。其中data
为数据,indices
为序号索引,二者是一一对应的。而intptr
则对数据进行分割,表明其属于哪一列。
个中关系,举个例子就能明白
from scipy.sparse import csc_array
import numpy as np
indptr = [0, 2, 3, 6]
indices = [0, 2, 2, 0, 1, 2]
data = [1,2,3,4,5,6]
csc = csc_array((data, indices, indptr))
print(csc.toarray())
'''
[[1 0 4]
[0 0 5]
[2 3 6]]
'''
先看indptr
,里面共有4个值,这4个值组成了3个区间[0,2), [2,3), [3,6)
,说明接下来要生成的矩阵共有3列。
然后在看三个区间对应的indices
和data
,以第0个区间[0,2)
为例,对应的indices
是0,2
,对应的data
是1,2
,说明第0列的第0号是1、第2号是2,所以看上面的矩阵,第一列为
(
1
,
0
,
2
)
T
(1,0,2)^T
(1,0,2)T;第1个区间为[2,3)
,对应的indices, data
分别为2
和3
,说明第1列的第2个元素是3
。
初始化方案
csc_array
支持下面5种初始化方案,其中最后一种就是上面讲解的生成逻辑。后两种方法有参数shape
,可以指定稀疏矩阵的维度,如果不指定,则生成满足要求的最小维度的稀疏矩阵。
csc_array(D)
D是一个稀疏数组或 2 × D 2\times D 2×D数组csc_array(S)
S是另一种稀疏数组csc_array((M, N),dtype='d')
创建一个shape为 ( M , N ) (M, N) (M,N)的空数组,dtype为数据类型csc_array((data, ij))
ij
是坐标数组,可分解为i,j=ij
,data
是数据数组,设新矩阵为a
,则a[i[k], j[k]] = data[k]
csc_array((data, indices, indptr))
内置方法
稀疏数组在计算上并不便捷,所以bsr_array
中内置了下列函数,可以高效地完成计算。此外,scipy.sparse.linalg
提供了更多的适用于稀疏矩阵的函数。
函数 | expm1, log1p, sqrt, pow, sign |
三角函数 | sin, tan, arcsin, arctan, deg2rad, rad2deg |
双曲函数 | sinh, tanh, arcsinh, arctanh |
索引 | getcol, getrow, nonzero, argmax, argmin, max, min |
舍入 | ceil, floor, trunc |
变换 | conj, conjugate, getH |
统计 | count_nonzero, getnnz, mean, sum |
矩阵 | diagonal, trace |
获取属性 | get_shape, getformat |
计算比较 | multiply, dot, maximum, minimum |
转换 | asformat, asfptype, astype, toarray, todense |
转换 | tobsr, tocoo, tocsc, tocsr, todia, todok, tolil |
更改维度 | set_shape, reshape, resize, transpose |
排序 | sort_indices, sorted_indices |
移除元素 | eliminate_zeros, prune, sum_duplicates |
其他 | copy, check_format, getmaxprint, rint, setdiag |