SciPy 稀疏数据
什么是稀疏数据
稀疏数据是大部分元素是未使用的(不携带任何信息的元素)的数据。
它可以是一个像这样的数组
[1, 0, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0]
稀疏数据: 是一个数据集中大部分项的值为零。
密集数组: 是稀疏数组的相反:大部分值不是零。
在科学计算中,当我们处理线性代数中的偏微分方程时,我们会遇到稀疏数据。
如何处理稀疏数据
SciPy 有一个模块,scipy.sparse
,它提供了处理稀疏数据的功能。
我们主要使用两种类型的稀疏矩阵
CSC - Compressed Sparse Column(压缩稀疏列)。用于高效的算术运算,快速的列切片。
CSR - Compressed Sparse Row(压缩稀疏行)。用于快速的行切片,更快的矩阵向量乘法。
在本教程中,我们将使用CSR矩阵。
CSR 矩阵
我们可以通过将一个数组传递给函数 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 个有值的元素。
第 1 个元素在行 0
的位置 5
,值为 1
。
第 2 个元素在行 0
的位置 6
,值为 1
。
第 3 个元素在行 0
的位置 8
,值为 2
。
稀疏矩阵方法
使用 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)
自己动手试一试 »
注意: 除了上述提到的稀疏特定操作外,稀疏矩阵还支持所有常规矩阵的操作,例如重塑、求和、算术运算、广播等。