gpt4 book ai didi

python - 在 Scipy 中切片稀疏矩阵——哪种类型效果最好?

转载 作者:IT老高 更新时间:2023-10-28 22:21:21 27 4
gpt4 key购买 nike

SciPy Sparse Matrix tutorial非常好——但它实际上留下了未开发的切片部分(仍处于大纲形式——参见“处理稀疏矩阵”部分)。

一旦这个问题得到解答,我会尝试更新教程。

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

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

对于各种方法,我希望能够对列进行切片,而对于其他方法,我希望对行进行切片。理想情况下,我会使用高级索引(即 bool 向量,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_matrices 不支持这一点——但我认为如果我首先通过 sparse.lil_matrix(M)

转换为 lil_matrices,它会(缓慢地)工作

据我从教程中收集到的信息,我想使用 CSC 对列进行切片,对我想对 CSR 进行切片的行。这是否意味着我应该通过以下方式转换矩阵 M:

M.tocsc()[:,bool_vect]

M.tocsr()[bool_vect,:]

我在这里有点猜测,因此我的代码很慢。任何了解其工作原理的人的帮助将不胜感激。提前致谢。

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

最后——这是一个很大的矩阵,所以如果这可以发生在适当的位置/通过广播,可以加分。

最佳答案

好的,所以我很确定这样做的“正确”方法是:如果要对列进行切片,请使用 tocsc() 并使用整数列表/数组进行切片。 bool 向量似乎对稀疏矩阵不起作用——就像它在 numpy 中对 ndarray 所做的那样。这意味着答案是。

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

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

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

关于python - 在 Scipy 中切片稀疏矩阵——哪种类型效果最好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13352280/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com