将scipy稀疏矩阵转换为基于索引的numpy数组

将scipy稀疏矩阵转换为基于索引的numpy数组,numpy,scipy,sparse-matrix,Numpy,Scipy,Sparse Matrix,我有一个scipy稀疏矩阵,其中N个值为非零值,我希望返回一个带有形状(N,3)的numpy数组,其中第一列包含非零值的索引,最后一列包含相应的非零值 例如: 我想要 mymatrix.toarray() matrix([[0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0.

我有一个scipy稀疏矩阵,其中N个值为非零值,我希望返回一个带有形状(N,3)的numpy数组,其中第一列包含非零值的索引,最后一列包含相应的非零值

例如:

我想要

mymatrix.toarray()
matrix([[0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        ],
        [0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        ],
        [0.        , 0.        , 0.        , 0.83885831, 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        ],
        [0.        , 0.        , 0.        , 0.        , 0.        , 1.13395003, 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        ],
        [0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        ],
        [0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        ],
        [0.        , 0.        , 0.        , 0.        , 0.        , 0.57979727, 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        ],
        [0.        , 0.        , 0.        , 0.        , 0.75500017, 0.        , 0.81459546, 0.        , 0.        , 0.        , 0.        , 0.        , 0.        ],
        [0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.87997548, 0.        , 0.        , 0.        ],
        [0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        ],
        [0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        ],
        [0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        ],
        [0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        , 0.        ]])
成为

np.array([[3, 2, 0.83885831], [4,5,1.13395003], [6,5,0.57979727], [7,4,0.75500017], [7,6,0.81459546], [8,9,0.87997548]])

array([[3.        , 2.        , 0.83885831],
       [4.        , 5.        , 1.13395003],
       [6.        , 5.        , 0.57979727],
       [7.        , 4.        , 0.75500017],
       [7.        , 6.        , 0.81459546],
       [8.        , 9.        , 0.87997548]])
我如何有效地做到这一点

转换后,我将迭代行-因此,如果有一个有效的选项可以在不进行转换的情况下迭代行,我也希望:

for index_i, index_j, value in mymatrix.iterator():
     do_something(index_i, index_j, value)
对于迭代,dok(dictionary of keys)格式看起来像是自然匹配;你可以做:

for (i,j), v in your_sparse_matrix.todok().items():
    etc.
Nx3坐标值记录列表可通过coo格式轻松获取:

 coo = your_sparse_matrix.tocoo()
 np.column_stack((coo.row,coo.col,coo.data))
显然,这也可以用于迭代;您必须测试在您的用例中哪个更快