问题描述
我有一个大维度的稀疏矩阵,我想对每行 i 的元素求和,并用结果填充对角线。我该怎么做?
我的麻木方法:
A = np.sum(A,axis=1)
D = np.diag(A)
我如何用 scipy 解决这个问题?
编辑:我使用 scipy.sparse 并将 A 初始化为 csr_matrix。我已经阅读了文档,但也许我被误读或遗漏了一些东西。使用 sparse.diags(D),我只得到一个列数组,即当我尝试将稀疏矩阵转换为 np.array 时,它没有给我一个对角矩阵。
解决方法
制作稀疏矩阵:
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,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.,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),3))