目录
1 引言
在矩阵处理中为了减少内存的占用经常用到各种形式的稀疏矩阵存储方式(比如单位阵,会造成空间浪费),这时就采用矩阵压缩的方式来表述,数据不变,存储形式发生改变,省很多空间。),scipy(一个Python库)就是一个利器。下面就介绍scipy中稀疏矩阵存储的各种函数,其中很多内容多有参考他人博客,就不一一在文中列出而是在参考文献中一并给出链接。
2 csr_matrix
为了方便记忆可以把csr分成三个单词compress sparse row,因此csr是按行压缩的稀疏矩阵。
2.1 csr_matrix 返回值解释
csr_matrix矩阵返回值有三个属性indptr indices data 可以分别对应 count index data 三个通俗的解释。
- 由于csr_matrix是按行压缩的矩阵indptr(count)为每行中元素不为0个数的计数,值得注意的是这个计数是累加的,详细的解释看下面的例子。
- indices即index,表示每行中不为0元素的列的索引位置
- data 就是压缩矩阵中不为0的元素,返回的值是按照从0行到n行的顺序来的
'''
# 原始矩阵orig样例:
orig = array([[1, 0, 2],
[0, 0, 3],
[4, 5, 6]])
CSR: 按【行row】来压缩,便于理解,进行重命名
count,就是官方的indptr,是一个递增数组
含义:【差值】是统计原始矩阵每【行】【非0数据】的【个数】,
反向理解,就是【累加】原始矩阵每行的【非0数据】的【个数】
对于count数组,假设索引为i,
count[i+1] - count[i]就是原始矩阵【第i行】的【非0数据】的【个数】
样例:
当i=0时,count[1] - count[0] = 2-0 = 2, 表示原始矩阵【第0行】的【非0数据】有【2个】
当i=1时,count[2] - count[1] = 3-2 = 1, 表示原始矩阵【第1行】的【非0数据】有【1个】
当i=2时,count[3] - count[2] = 6-3 = 3, 表示原始矩阵【第2行】的【非0数据】有【3个】
index, 就是官方的indices,是一个【列索引】数组
含义:对于CSR,这里就是【列】的索引,即表示原始矩阵当前行中的【非0数据】所在的【列索引值】
对于index和count数组,假设索引为i,
index[count[i]: count[i+1]]表示原始矩阵中【第i行】的【非0数据】所在的【列索引值】
ps:注意中间是【冒号】
样例:
当i=0时,index[count[0]:count[1]] = index[0:2]= [0,2],
表示原始矩阵【第0行】的【2个】【非0数据】所在的【列索引值】为0和2,即定位为orig[0,0]和orig[0,2]
当i=1时,index[count[1]:count[2]] = index[2:3]= [2],
表示原始矩阵【第0行】的【1个】【非0数据】所在的【列索引值】为2,即定位为orig[1,2]
当i=2时,index[count[2]:count[3]] = index[3:6]= [0,1,2],
表示原始矩阵【第0行】的【3个】【非0数据】所在的【列索引值】为0,1,2,即定位为orig[2,0], orig[2,1]和orig[2,2]
data,保持不变, 按行顺序,存储【非0数据】的数组
含义:根据index数组找到每行中【非0数据】的【列索引值】,依次存取数据即可
对于data和count数组,假设索引为i,
data[count[i]: count[i+1]]表示原始矩阵中【第i行】的【非0数据】的【值】
样例:
当i=0时,data[count[0]:count[1]] = data[0:2]= [1,2],
表示原始矩阵【第0行】的【2个】【非0数据】,即定位为orig[0,0] =1 和orig[0,2]=2
当i=1时,index[count[1]:count[2]] = index[2:3]= [2],
表示原始矩阵【第0行】的【1个】【非0数据】,即定位为orig[1,2]=3
当i=2时,index[count[2]:count[3]] = index[3:6]= [0,1,2],
表示原始矩阵【第0行】的【3个】【非0数据】,即定位为orig[2,0]=4, orig[2,1]=5 和orig[2,2]=6
'''
count = np.array([0, 2, 3, 6])
index = np.array([0, 2, 2, 0, 1, 2])
data = np.array([1, 2, 3, 4, 5, 6])
# 将稀疏矩阵转为原始矩阵
orig = csr_matrix((data, index, count), shape=(3, 3)).toarray()
# 将原始矩阵转为稀疏矩阵
res = csr_matrix(orig)
print(res.indptr)
# [0 2 3 6]
print(res.indices)
# [0 2 2 0 1 2]
print(res.data)
# [1 4 5 2 3 6]
print(orig)
# [[1 0 2]
# [0 0 3]
# [4 5 6]]

本文介绍了scipy库中处理稀疏矩阵的方法,包括csr_matrix、csc_matrix和coo_matrix等函数的使用,以及这些矩阵的定义、转换和基本运算。
最低0.47元/天 解锁文章
610

被折叠的 条评论
为什么被折叠?



