微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

总结scipy行并将其填充在对角线上

如何解决总结scipy行并将其填充在对角线上

我有一个大维度的稀疏矩阵,我想对每行 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))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。