百度百科:在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵;与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵。定义非零元素的总数比上矩阵所有元素的总数为矩阵的稠密度。 简单来说,稀疏矩阵就是绝大部分都是0的矩阵 ,只包含很少的非零值.
比如,
上述稀疏矩阵非零元素有9个,26个零值.稀疏性是74%.
稀疏矩阵因为绝大部分都是0元素,如果我们仍然按照普通方式存储,无疑会 浪费很多空间 同时如果进行运算时,0元素对最终结果也没有帮助, 增加了许多无效计算 . 因此,我们需要设计出新的存储方式,或者说数据结构来存储稀疏矩阵.比较常见的有:
对于稀疏矩阵的存储,为了达到压缩的目的(节省存储空间),只存储非0元素值,但是也要保留非零元素的位置,方便恢复.所以,我们存储时不仅存储非零元素值,同时存储其坐标位置(row,column). 针对这两者的存储,会出现不同的设计方案.这里主要介绍COO,CSR和CSC存储格式.
我们使用三个数组row,column和粗磨高data分别用来存储非零元素坐标的row_index,col_index,以及数值.比如:
NNO:The number of nonzero.矩阵非零元素个数. 三个数组的长度都是NNO.data[i]在原稀疏矩阵中的坐标为(row[i],col[i]]).
可以发现,这种存储方式中,row数组和岩尺column数组中有一定的重复元素.我们是否可以针对这个冗余特性进一步进行压缩?之后出现CSR,CSC,分别是对row数组和column数组进行了压缩.
对COO稀疏矩阵存储格式的三个数组中的row数组进行压缩.其他两个数组保持不游蠢变三个数组分别是row_ptr,columns和data.其中columns和data数组长度均为NNO(矩阵的非零元素个数). 如何对COO的row进行压缩?
row_ptr存储的是每行的第一个非零元素距离稀疏矩阵第一个元素的偏移位置
由row_ptr我们可以知道每行非零元素在data中的index范围.第i行的非零元素为data[row_ptr[i]:row_ptr[i+1]],对data数组的切片,不包含data[row_ptr[i+1]]同时第i行非零元素的col坐标分别为columns[row_ptr[i]:row_ptr[i+1]]对data和columns的访问相似,index是相同的.
如上图中,第0行非零元素在data中是data[0:2],就是1,7列坐标为columns[0:2],就是0,1,第1行非零元素为data[2:4],有两个元素2和8,列坐标分别为columns[2:4],1和2.
方便进行行 *** 作.
和CSR类似.只不过对列进行压缩,row和data保持不变.
方便进行列 *** 作.
coo_matrix全称是A sparse matrix in COOrdinate format,一种基于坐标格式的稀疏矩阵,每一个矩阵项是一个三元组(行,列,值)。该矩阵的常见构造方法有如下几销伍种:
输出为:
使用稠密二维数组构造
输出为:
array([[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]], dtype=int8)
输出为:
array([[4, 0, 9, 0],
[0, 7, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 5]])
如果行列坐标有重复,对应的值直接累加,举例如下:
输出为:
array([[3, 0, 1, 0],
[0, 2, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 1]])
csr是Compressed Sparse Row matrix的缩写即亏哗或压缩稀疏基于行存储的矩阵,好绕口,该矩阵有如下几种构造方法:
输出为:
输出为:
array([[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]], dtype=int8)
输出为:
array([[1, 0, 2],
[0, 0, 3],
[4, 5, 6]])
按行存储,即先存储第0行,然后第1行,依次到最后一行,即先扫描row数组的数据,第一个数据是0即第0行,然后扫描col的第一个数据是0即第0列,那么第0行第0列存储的值就是data的第一个数据即1,然后继续扫描row的第二个数据还是0即还是第0行,col对应的第二个数据是2即第2列,data的第二个数据是2,即第0行第2列的数据是2,依次扫描row,找对应的col和data构造稀疏矩阵。
输出为:
array([[1, 0, 2],
[0, 0, 3],
[4, 5, 6]])
csc是Compressed Sparse Column matrix的缩写即基于列存储的压缩稀疏矩阵,该矩阵有如下几种构造方法:
输出如下:
和前面的csr的输出对比可以看出该矩阵是按列逐个存储。
输出如下:
array([[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]], dtype=int8)
输出如下:
array([[1, 0, 4],
[0, 0, 5],
[2, 3, 6]])
输出如下:
array([[1, 0, 4],
[0, 0, 5],
[2, 3, 6]])
coo_matrix由于构造方便容易理解,所以通常都是先构造该矩阵然后调用tocsr和tocsc函数来获取另外两种矩阵的存储。
csr_matrix支持快速的按行切片,而csc_matrix则支芦亮持快速按列切片 *** 作。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)