Python将矩阵转为稀疏矩阵

在数据分析和机器学习中,我们经常会遇到大规模的数据集,其中包含大量的零元素。对于这种稀疏矩阵(sparse matrix),传统的表示方式往往会浪费大量的内存空间。因此,将矩阵转换为稀疏矩阵是一种常见的数据预处理方法,可以有效地节省存储空间和计算资源。

本文将介绍如何使用Python将一个矩阵转换为稀疏矩阵,以及稀疏矩阵的常见表示方法和应用场景。

什么是稀疏矩阵?

稀疏矩阵是指矩阵中大部分元素为零的矩阵。相对而言,稠密矩阵(dense matrix)是指矩阵中大部分元素都非零的矩阵。在实际应用中,稀疏矩阵往往会比稠密矩阵更节省存储空间和计算资源。

例如,下面是一个稠密矩阵的示例:

2 1
3
4 5

而下面是对应的稀疏矩阵的表示方式:

(0, 0) 2
(0, 2) 1
(1, 1) 3
(2, 0) 4
(2, 2) 5

在稀疏矩阵的表示中,我们只需要存储非零元素的值以及对应的索引,可以大大减少存储空间的占用。

稀疏矩阵的表示方法

稀疏矩阵有多种表示方法,常见的有三种:COO(Coordinate List)、CSR(Compressed Sparse Row)和CSC(Compressed Sparse Column)。

COO(Coordinate List)

COO表示法是最直观的一种表示方法,它将稀疏矩阵表示为一个包含非零元素的坐标列表。每个元素都包含三个值:行索引、列索引和元素值。

下面是同样的稀疏矩阵使用COO表示法的示例:

import numpy as np
from scipy.sparse import coo_matrix

data = np.array([2, 1, 3, 4, 5])
row = np.array([0, 0, 1, 2, 2])
col = np.array([0, 2, 1, 0, 2])

sparse_matrix = coo_matrix((data, (row, col)), shape=(3, 3))
print(sparse_matrix)

输出结果为:

  (0, 0)	2
  (0, 2)	1
  (1, 1)	3
  (2, 0)	4
  (2, 2)	5

CSR(Compressed Sparse Row)

CSR表示法是一种将稀疏矩阵表示为三个数组的方法:data、indices和indptr。其中,data数组存储非零元素的值,indices数组存储对应的列索引,indptr数组存储每行第一个非零元素在data和indices数组中的位置。

下面是同样的稀疏矩阵使用CSR表示法的示例:

import numpy as np
from scipy.sparse import csr_matrix

data = np.array([2, 1, 3, 4, 5])
row = np.array([0, 0, 1, 2, 2])
col = np.array([0, 2, 1, 0, 2])

sparse_matrix = csr_matrix((data, (row, col)), shape=(3, 3))
print(sparse_matrix)

输出结果为:

  (0, 0)	2
  (0, 2)	1
  (1, 1)	3
  (2, 0)