Numpy/Scipy - 稀疏矩阵到向量

标签 numpy scipy sparse-matrix

我有稀疏 CSR 矩阵(来自两个稀疏向量的乘积),我想将每个矩阵转换为平面向量。事实上,我想避免使用任何密集表示或迭代索引。

到目前为止,唯一的解决方案是使用 coo 表示来迭代非 null 元素:

import numpy
from scipy import sparse as sp
matrices = [sp.csr_matrix([[1,2],[3,4]])]*3
vectorSize = matrices[0].shape[0]*matrices[0].shape[1]
flatMatrixData = []
flatMatrixRows = []
flatMatrixCols = []
for i in range(len(matrices)):
    matrix = matrices[i].tocoo()
    flatMatrixData += matrix.data.tolist()
    flatMatrixRows += [i]*matrix.nnz
    flatMatrixCols += [r+c*2 for r,c in zip(matrix.row, matrix.col)]
flatMatrix = sp.coo_matrix((flatMatrixData,(flatMatrixRows, flatMatrixCols)), shape=(len(matrices), vectorSize), dtype=numpy.float64).tocsr()

确实令人不满意且不优雅。有谁知道如何以有效的方式实现这一目标?

最佳答案

你的平面矩阵是(3,4);每行是 [1 3 2 4]。如果子矩阵为 x,则该行为 x.A.T.flatten()

F = sp.vstack([x.T.tolil().reshape((1,vectorSize)) for x in matrices])

F 是相同的(dtype 是 int)。我必须将每个子矩阵转换为 lil,因为 csr 尚未实现 reshape(在我的 sparse 版本中)。我不知道其他格式是否有效。

理想情况下,sparse 可以让您执行整个范围的 numpy 数组(或矩阵)操作,但目前还没有。

鉴于此示例中的尺寸较小,我不会推测替代方案的速度。

关于Numpy/Scipy - 稀疏矩阵到向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24440332/

相关文章:

python - 求离散定义函数的全局最小值

c++ - 并行使用 Eigen BICGSTAB 求解稀疏矩阵

matlab - 获取在 matlab 稀疏矩阵中按降序排序的前 N ​​个值的索引

Python 等效于 R 的因子数据类型

python - Gurobi/python 中的稀疏矩阵 LP 问题

python - 在 Numpy 数组上计算交错/移位均值

python - 从边界点创建闭合多边形

python - 为什么 B = numpy.dot(A,x) 循环执行 B[i, :, :] = numpy. dot(A[i, :, :], x) ) 如此慢?

python - 根据概率密度函数 p(x,y,z) 随机填充 3D 网格

python - 反向 Box-Cox 变换