csr_matrix矩阵压缩

scipy库中的sparse.csr_matrix可对稀疏的np.array进行压缩处理,有两种方式:csr(Compressed Sparse Row marix) 和 csc(Compressed Sparse Column marix)。下面通过两个最常见的栗子说明一下。

scipy.sparse.csr_matrix  按行进行压缩

>>> 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])
>>> csr_matrix((data, indices, indptr), shape=(3, 3)).toarray()
array([[1, 0, 2],
       [0, 0, 3],
       [4, 5, 6]])

解释说明:
indptr: 代表每行中有多少个不为0的值,其中第一项0是固定的,第2项与第一项的差值表示第0行有2-0个不为0的值,第3项与第2项的差3-2=1表示第1行有一个不为0的值,依次类推
indices: indptr指明了每行有多少个非0项,indices则指定每行究竟是那几列不为0,例子中第0行有2个非0,则对应indices中前两项,即0,2两列不为0,第1行有1个非0,则对应indices中的2列不为0,依次类推
data: 则代表这些不为0的值具体是什么值,例子中第0行的0,2两列不为0,即对应data中的1,2两个值,第1行的2列不为0,则对应data中的3这个值。
.toarray()将压缩后的数据又转成了array形式,其中压缩后的数据形式如下:

feature = csr_matrix((data, indices, indptr), shape=(3, 3))
print (feature)
输出为:
  (0, 0)        1
  (0, 2)        2
  (1, 2)        3
  (2, 0)        4
  (2, 1)        5
  (2, 2)        6
第一行(0, 0)  1表示第0行第0列值为1,其它同理

scipy.sparse.csc_matrix  按列进行压缩
与scipy.sparse.csr_matrix同理,同样通过最常见的栗子进行简单说明。

>>> 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 相邻两项的差值即表示对应列有多少个非0的值。
indices 表示每列中对应的非0值在哪几行。
data 表示这些非0的值具体是啥值。

另:csr_matrix的压缩还有其它方式,比如下面这种:

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

这里与上面的csr_matrix不同的是,indptr 记录的是每一个非0值所在的行,indptr ,indices ,data 可以纵向看,0行0列值为1,0行2列值为2,依次类推。这里需要注意的是csr_matrix((data, (indptr, indices)), shape=(3, 3))中csr_matrix的第一项由 (data, indices, indptr) 改为了 (data, (indptr, indices))

当遇到稀疏矩阵时,数据量比较大,但是大部分都是0,此时可以记录非0值所在的列,以及每行非0值的个数或者非0值所在的行(前者占更少的存储空间),然后对其再进行压缩。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值