在Scipy中切片稀疏矩阵——哪种类型最有效?

2024-06-06 11:13:06 发布

您现在位置:Python中文网/ 问答频道 /正文

SciPySparse Matrix tutorial非常好——但它实际上留下了开发的关于切片un(der)的部分(仍然是大纲形式——请参阅“处理稀疏矩阵”部分)。

回答完这个问题后,我将尝试更新教程。

我有一个很大的稀疏矩阵——目前是dok_矩阵格式。

import numpy as np
from scipy import sparse
M = sparse.dok_matrix((10**6, 10**6))

对于各种方法,我希望能够切片列,对于其他方法,我希望切片行。理想情况下,我将使用高级索引(即布尔向量,bool_vect)来分割稀疏矩阵M——如:

bool_vect = np.arange(10**6)%2  # every even index
out = M[bool_vect,:]            # Want to select every even row

或者

out = M[:,bool_vect] # Want to select every even column

首先,dok_矩阵不支持这一点——但我认为,如果我首先通过sparse.lil_matrix(M)转换成lil_矩阵,它会(缓慢地)工作

从本教程中我可以了解到,要对要使用CSC的列进行切片,还要对要对CSR进行切片的行进行切片。所以,这是否意味着我应该通过以下方式投射矩阵M

M.tocsc()[:,bool_vect]

或者

M.tocsr()[bool_vect,:]

我只是在猜测,所以我的代码很慢。如果有人能理解这一点,我们将不胜感激。提前谢谢。

如果结果证明我不应该用布尔数组索引我的矩阵,而是用一个整数(索引)列表——这也是我很乐意发现的。哪个更有效。

最后——这是一个很大的矩阵,所以如果这可以在适当的地方/通过广播实现,就可以得到加分。


Tags: 方法importnp切片教程矩阵outmatrix
1条回答
网友
1楼 · 发布于 2024-06-06 11:13:06

好吧,我敢肯定正确的做法是: 如果要对列进行切片,请使用tocsc()并使用整数列表/数组进行切片。布尔向量似乎并不像numpy中的ndarrays那样处理稀疏矩阵。这意味着答案是。

indices = np.where(bool_vect)[0]
out1 = M.tocsc()[:,indices]
out2 = M.tocsr()[indices,:]

但问题是:这是最好的方法吗?这个到位了吗?

在实践中,这似乎确实发生了——而且比以前的尝试(使用lil_matrix)要快得多。

相关问题 更多 >