首页 > 解决方案 > 总结 scipy 行并将其填充到对角线中

问题描述

我有一个大维度的稀疏矩阵,我想对每一行的元素求和,i,并用结果填充对角线。我该怎么做呢?

我的 numpy 方法:

A = np.sum(A, axis=1)
D = np.diag(A)

我如何用 scipy 解决这个问题?

编辑:我正在使用 scipy.sparse 并将 A 初始化为 csr_matrix。我已经阅读了文档,但也许我被误读或遗漏了一些东西。使用 sparse.diags(D),我只得到了一个列数组,即当我试图将稀疏矩阵转换为 np.array 时,它没有给我一个对角矩阵。

标签: scipy

解决方案


制作一个稀疏矩阵:

In [149]: from scipy import sparse
In [150]: M = sparse.csr_matrix(np.arange(6).reshape(2,3))
In [151]: M
Out[151]: 
<2x3 sparse matrix of type '<class 'numpy.int64'>'
    with 5 stored elements in Compressed Sparse Row format>
In [152]: M.A
Out[152]: 
array([[0, 1, 2],
       [3, 4, 5]])

在轴上求和:

In [153]: M.sum(axis=0)
Out[153]: matrix([[3, 5, 7]])

注意这是一个密集的np.matrix. 由于sum增加了密度,sparse所以返回这个而不是稀疏矩阵。

将该矩阵转换为 1d ndarray

In [154]: M.sum(axis=0).A1
Out[154]: array([3, 5, 7])

用于diags制作稀疏矩阵:

In [155]: M1=sparse.diags(M.sum(axis=0).A1)
In [156]: M1
Out[156]: 
<3x3 sparse matrix of type '<class 'numpy.float64'>'
    with 3 stored elements (1 diagonals) in DIAgonal format>
In [157]: M1.A
Out[157]: 
array([[3., 0., 0.],
       [0., 5., 0.],
       [0., 0., 7.]])

阅读sparse.diags以查看其所需的参数。 sparse.dia_matrix也可以使用(但也可以阅读它的文档)。

格式矩阵上的数学Dia很可能会产生csr格式矩阵。

其他对角线创建命令:

M1=sparse.diags(M.sum(axis=0),[0], shape=(3,3))
M1=sparse.dia_matrix((M.sum(axis=0), 0),shape=(3,3))

推荐阅读