scipy稀疏矩阵

csc_matrix

例如:

1
2
3
4
5
6
>>> import numpy as np
>>> from scipy.sparse import csc_matrix
>>> csc_matrix((3, 4), dtype=np.int8).toarray()
array([[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]], dtype=int8)

再比如:

1
2
3
4
5
6
7
>>> row = np.array([0, 2, 2, 0, 1, 2])
>>> col = np.array([0, 0, 1, 2, 2, 2])
>>> data = np.array([1, 2, 3, 4, 5, 6])
>>> csc_matrix((data, (row, col)), shape=(3, 3)).toarray()
array([[1, 0, 4],
[0, 0, 5],
[2, 3, 6]])

data是存储的数据,矩阵以列来存储,很多人学习完了线性代数,甚至不知道矩阵一般是以列还是以行来存储。从向量Vector的角度来看,矩阵都应该以列方式来存储,以列来理解和存储更符合实际需要,我们常用的行向量$x = [1,2,3,5]$,在运算时都要进行一个转置$x^T$。实际上Numpy中矩阵也是使用csc_matrix存储。

那么,在上面例子中,csc_matrix表示以列的形式存储矩阵,观察可知datarowcol的维度相同,既然data为存储的数据,那么可以联想到row[i]col[i]表示data[i]数据在矩阵的位置,例如row[1]=2col[1]=0表示矩阵的第3行第1列存储data[1]=2

再比如:

1
2
3
4
5
6
7
>>> indptr = np.array([0, 2, 3, 6])
>>> indices = np.array([0, 2, 2, 0, 1, 2])
>>> data = np.array([1, 2, 3, 4, 5, 6])
>>> csc_matrix((data, indices, indptr), shape=(3, 3)).toarray()
array([[1, 0, 4],
[0, 0, 5],
[2, 3, 6]])

这个略微复杂,但其实也非常容易理解: indptr表示的是indices矩阵里的开始和结尾的index, 例如indptr [0,2]表示indices[0:2]存储了第一列的数据所在位置——0行和2行,indptr [2,3]表示indices[2:3]存储了第二列的数据位置——第2行(注意从0行开始), 每个indices[i]对应一个data[i]。注意Python list[0:i]取值为list[0....i-1]实际上indeces[0:2]只取了indices第一个和第二个数值0和2,代表数据在0和2行,其余位置皆为0;inices[2:3]取了indices[2]的数值2,代表数据在第2行,其余位置皆为0。

coo_matrix

例如:

1
2
3
4
5
>>> from scipy.sparse import coo_matrix
>>> coo_matrix((3, 4), dtype=np.int8).toarray()
array([[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]], dtype=int8)

再比如:

1
2
3
4
5
6
7
from scipy.sparse import coo_matrix
import numpy as np
row = np.array([0, 2, 2, 0, 1, 2])
col = np.array([0, 0, 1, 2, 2, 2])
data = np.array([1, 2, 3, 4, 5, 6])

coo_matrix((data, (row, col)), shape=(3, 3)).toarray()

结果:

1
2
3
array([[1, 0, 4],
[0, 0, 5],
[2, 3, 6]])

关于该代码的解释和上面csc_matrix小节中csc_matrix((data, (row, col)), shape=(3, 3)).toarray()相同,且运行结果相同。

csr_matrix

行压缩矩阵:scipy.sparse.csr_matrix(arg1, shape=None, dtype=None, copy=False)

通过csc_matrix(D)形式构造,其中D的维度必须小于等于2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
In [1]: import  numpy as np
...: from scipy.sparse import csr_matrix
...: arr = np.array([[0,1,0,2,0],[1,1,0,2,0],[2,0,5,0,0]])
...: b = csr_matrix(arr)
...:


In [2]: b
Out[2]:
<3x5 sparse matrix of type '<class 'numpy.int32'>'
with 7 stored elements in Compressed Sparse Row format>


In [3]: type(b)
Out[3]: scipy.sparse.csr.csr_matrix

csr_matrix对象属性(这些属性也适用于csc_matrix和coo_matrix创建的稀疏矩阵):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
In [4]: b.shape
Out[4]: (3, 5)

In [5]: b.nnz
Out[5]: 7

In [6]: b.ndim
Out[6]: 2

In [7]: b.data
Out[7]: array([1, 2, 1, 1, 2, 2, 5], dtype=int32)

In [8]: b.indices
Out[8]: array([1, 3, 0, 1, 3, 0, 2], dtype=int32)

In [9]: b.indptr
Out[9]: array([0, 2, 5, 7], dtype=int32)

nnz属性:稀疏矩阵非零元素个数
data属性:稀疏矩阵中元素
indices属性:稀疏矩阵非0元素对应的列索引值所组成数组
indptr属性:第一个元素0,之后每个元素表示稀疏矩阵中每行元素(非零元素)个数累计结果

参考

十分钟理解Scipy.csc_matrix和coo_matrix
scipy.sparse学习

------ 本文结束------
坚持原创技术分享,您的支持将鼓励我继续创作!

欢迎关注我的其它发布渠道