常见稀疏矩阵格式及转换

背景

推荐系统处理中常会遇到稀疏矩阵的生成、转换等需求,将常用方法进行汇总
以下是三种常见的稀疏矩阵存储格式:COO(坐标格式)、CSR(压缩稀疏行格式)和CSC(压缩稀疏列格式)

COO:适合构建稀疏矩阵,但在矩阵操作方面效率较低。
CSR:适合行向量操作,如推荐系统中的用户-物品评分矩阵。
CSC:适合列向量操作,在某些线性代数计算中更有优势。

COO-坐标格式

定义

COO(Coordinate Format)是一种简单的稀疏矩阵存储格式,它通过三个一维数组来存储非零元素的位置和值。 这三个数组分别是:
data:存储非零元素的值。
row:存储每个非零元素所在的行索引。
col:存储每个非零元素所在的列索引。

特点

  • 简单直观,易于构建和理解。
  • 不适合频繁的矩阵操作,如切片或索引,因为它需要遍历所有非零元素。
  • 适用于矩阵构建阶段,特别是当需要逐个元素填充矩阵时。

CSR-压缩稀疏行格式

定义

CSR(Compressed Sparse Row)是一种用于存储稀疏矩阵的格式,它通过三个一维数组来存储非零元素的位置和值。
这三个数组分别是:

  • data:存储非零元素的值。
  • indices:存储每个非零元素所在的列索引。
  • indptr:存储每一行非零元素的起始位置的索引,以及矩阵末尾的一个额外元素,表示所有非零元素的总数。

特点

支持高效的行访问,适合行向量操作,如矩阵-向量乘法。
不支持高效的列访问。
适用于需要频繁执行行向量操作的情况,例如在推荐系统中进行用户-物品评分矩阵的操作。

CSC-压缩稀疏列格式

定义

与CSR类似,但它是以列为基础进行存储的。
同样使用三个一维数组:

  • data:存储非零元素的值。
  • indices:存储每个非零元素所在的行索引。
  • indptr:存储每一列非零元素的起始位置的索引,以及矩阵末尾的一个额外元素,表示所有非零元素的总数。

特点

支持高效的列访问,适合列向量操作,如转置矩阵-向量乘法。
不支持高效的行访问。
适用于需要频繁执行列向量操作的情况,例如在某些线性代数计算中。

转换

在SciPy库中,稀疏矩阵之间可以很容易地相互转换。COO、CSR和CSC格式的稀疏矩阵可以相互转换,这使得在不同的应用场景下可以根据需要选择最合适的格式

函数

从COO转换为CSR:

使用to_csr()方法直接转换。

从COO转换为CSC:

使用to_csc()方法直接转换。

从CSR转换为COO:

使用tocoo()方法直接转换。

从CSR转换为CSC:

使用tocsc()方法直接转换。

从CSC转换为COO:

使用to_coo()方法直接转换。

从CSC转换为CSR:

使用to_csr()方法直接转换。

测试代码

import numpy as np
from scipy.sparse import coo_matrix, csr_matrix, csc_matrix

# 创建一个COO格式的稀疏矩阵
data = np.array([1, 2, 3, 4])
row = np.array([0, 1, 2, 0])
col = np.array([0, 1, 2, 3])
coo_matrix = coo_matrix((data, (row, col)), shape=(3, 4))
print(coo_matrix )
# 从COO转换为CSR
csr_matrix = coo_matrix.tocsr()

# 从COO转换为CSC
csc_matrix = coo_matrix.tocsc()

# 创建一个CSR格式的稀疏矩阵
data = np.array([1, 2, 3, 4])
indices = np.array([0, 1, 2, 3])
indptr = np.array([0, 2, 3, 4])
csr_matrix = csr_matrix((data, indices, indptr), shape=(3, 4))

# 从CSR转换为COO
coo_matrix = csr_matrix.tocoo()

# 从CSR转换为CSC
csc_matrix = csr_matrix.tocsc()

# 创建一个CSC格式的稀疏矩阵
data = np.array([1, 2, 3, 4])
indices = np.array([0, 1, 2, 3])
indptr = np.array([0, 2, 3, 4])
csc_matrix = csc_matrix((data, indices, indptr), shape=(3, 4))

# 从CSC转换为COO
coo_matrix = csc_matrix.tocoo()

# 从CSC转换为CSR
csr_matrix = csc_matrix.tocsr()

# 输出稀疏矩阵
print("COO Matrix:")
print(coo_matrix.toarray())
print("CSR Matrix:")
print(csr_matrix.toarray())
print("CSC Matrix:")
print(csc_matrix.toarray())
  • 14
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值