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
表示以列的形式存储矩阵,观察可知data
、row
和col
的维度相同,既然data
为存储的数据,那么可以联想到row[i]
和col[i]
表示data[i]
数据在矩阵的位置,例如row[1]=2
和col[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学习