Scipy处理大型COO矩阵
我有一个很大的稀疏矩阵,使用的是scipy的coo_matrix
格式,大小达到5GB。我需要利用这个矩阵中的非零元素,并进行一些后续处理。
请问访问这个矩阵的元素最好的方法是什么?我应该把矩阵转换成其他格式,还是直接使用现在的格式?另外,能不能告诉我如何准确地访问coo_matrix
中的某个元素?我有点困惑,因为它不支持切片操作。
1 个回答
1
首先,我们来构建一个随机的 COO 矩阵:
import numpy as np
from scipy import sparse
x = sparse.rand(10000, 10000, format='coo')
这个矩阵中非零的数值可以在 .data
属性里找到,而对应的行和列的索引可以通过 x.nonzero()
来获取:
v = x.data
r, c = x.nonzero()
print np.all(x.todense()[r, c] == v)
# True
使用 COO 矩阵,你可以通过 getrow()
或 getcol()
方法来获取单独的一行或一列(这会变成一个稀疏向量)。如果你想对特定的元素进行切片或复杂的索引操作,那么你需要把它转换成另一种格式,比如使用 .tolil()
方法转换成 lil_matrix
。
你真的应该去看看 scipy.sparse
的文档,了解不同稀疏数组格式的特点——选择合适的格式其实是根据你打算如何使用这个数组来决定的。