SciPy依赖于Numpy,SciPy包含的功能:最优化、线性代数、积分、插值、拟合、特殊函数、快速傅里叶变换、信号处理、图像处理、常微分方程求解器等,SciPy是高端科学计算工具包,用于数学、科学、工程学等领域。本文主要介绍Python SciPy 稀疏数据(Sparse Data)。

1、什么是稀疏数据(Sparse Data)

稀疏数据是具有大部分未使用元素(不携带任何信息的元素)的数据。

可以是这样的数组:

[1, 0, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0]

稀疏数据:是一个数据集,其中大多数项目值均为零。密集数组:与稀疏数组相反:大多数值不为零。

在科学计算中,当我们处理线性代数中的偏导数时,我们会遇到稀疏数据。

2、如何处理稀疏数据

SciPy具有scipy.sparse模块,该模块提供处理稀疏数据的功能。

我们主要使用两种类型的稀疏矩阵:

CSC-压缩的稀疏列。为了进行有效的算术运算,可以快速进行列切片。

CSR-压缩的稀疏行。对于快速行切片,更快的矩阵向量乘积

在本教程中,我们将使用CSR矩阵。

3、CSR Matrix

我们可以通过将数组传递到函数scipy.sparse.csr_matrix()中来创建CSR矩阵。

例如:

从数组创建CSR矩阵:

import numpy as np
from scipy.sparse import csr_matrix

arr = np.array([0, 0, 0, 0, 0, 1, 1, 0, 2])

print(csr_matrix(arr))

上面的示例返回:

  (0, 5)	1
  (0, 6)	1
  (0, 8)	2

从结果中我们可以看到有3个项目具有值。

第一个项目在行0在位置5中,其值为1

第二个项目在行0在位置6中,并且值为1

第三个项目在行0在位置8中,并具有值2

4、稀疏矩阵的方法

使用data属性查看存储的数据(非零项):

例如:

import numpy as np
from scipy.sparse import csr_matrix

arr = np.array([[0, 0, 0], [0, 0, 1], [1, 0, 2]])

print(csr_matrix(arr).data)

使用count_nonzero()方法计数非零:

例如:

import numpy as np
from scipy.sparse import csr_matrix

arr = np.array([[0, 0, 0], [0, 0, 1], [1, 0, 2]])

print(csr_matrix(arr).count_nonzero())

使用eliminate_zeros()方法从矩阵中删除零项:

例如:

import numpy as np
from scipy.sparse import csr_matrix

arr = np.array([[0, 0, 0], [0, 0, 1], [1, 0, 2]])

mat = csr_matrix(arr)
mat.eliminate_zeros()

print(mat)

使用sum_duplicates()方法消除重复的条目:

例如:

通过添加重复项来消除重复项:

import numpy as np
from scipy.sparse import csr_matrix

arr = np.array([[0, 0, 0], [0, 0, 1], [1, 0, 2]])

mat = csr_matrix(arr)
mat.sum_duplicates()

print(mat)

使用tocsc()方法从csr转换为csc:

例如:

import numpy as np
from scipy.sparse import csr_matrix

arr = np.array([[0, 0, 0], [0, 0, 1], [1, 0, 2]])

newarr = csr_matrix(arr).tocsc()

print(newarr)

注意:除了上述提到的稀疏特定操作外,稀疏矩阵还支持普通矩阵支持的所有操作,例如:reshaping, summing, arithemetic, broadcasting etc.

推荐文档