Numpy 列转换时的稀疏度警告

Numpy 列转换时的稀疏度警告

在本文中,我们将介绍 Numpy 转换列的稀疏度警告,了解其原因和解决方法以提高代码的效率。

阅读更多:Numpy 教程

什么是稀疏度警告?

在使用 Numpy 数组的转换方法时,例如 np.array[:,i] = new_column,如果新列的数值大多数为0,则原始数组的稀疏度就会降低,导致一些先前可用的优化方法成为了障碍。

因此,Numpy 提供了一个警告,以提示用户在这种情况下进行转换的低效率。

下面是一个示例:

import numpy as np

arr = np.array([[0, 0, 0], [1, 2, 3], [4, 5, 6]])
new_col = np.array([0, 0, 0])
arr[:,0] = new_col
Python

这段代码将第一列全都设置为了0,这样会导致 3*3 的矩阵变得非常稀疏。因此,你会看到一段警告信息:

EfficiencyWarning: Changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient.
  "Changing the sparsity structure of a csr_matrix is expensive. "
Python

这个警告表示,如果这个数组之前是稠密的,则现在它将被转换为一个稀疏的形式。这种转换是非常消耗计算资源的,因此建议使用开销更小的 lil_matrix 类。

怎么解决?

避免这个警告的方法很简单,就是使用 scipy.sparse.lil_matrix 字类代替 numpy.array。这个子类不会返回稀疏度警告,并且通过修改行或列的操作效果也很好。

下面是代码示例:

from scipy.sparse import lil_matrix

arr = lil_matrix((3,3))
arr[0] = [0, 0, 0]
Python

注意到,代码中的 new_col 现在是一个稀疏矩阵(sparse matrix)类型。这是因为它们允许我们存储那些非零值。因此,不再需要在空列中存储很多0值,而是仅仅存储实际被修改的那些值。

为了进一步提高代码效率,你可以使用 COO 存储格式,例如 scipy.sparse.coo_matrix。这种存储格式能够更快地进行矩阵转换。

下面是展示 COO 的代码示例:

from scipy.sparse import coo_matrix

arr = coo_matrix((3,3))
arr = arr.tolil()
arr[0] = [0, 0, 0]
Python

这个示例中,我们先创建了一个 COO 矩阵,然后将其转换为 LIL 类型以进行行转换,最后得到了我们想要的结果。

总结

当你使用 Numpy 数组时,记得警惕稀疏度警告。针对这个问题,我们可以使用 LIL 和 COO 类型来代替纯 NumPy 数组,从而避免警告,并提高代码效率。希望这篇文章对你有所帮助!

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册