scipy - 总结 scipy 行并将其填充到对角线中
问题描述
我有一个大维度的稀疏矩阵,我想对每一行的元素求和,i,并用结果填充对角线。我该怎么做呢?
我的 numpy 方法:
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, 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))
推荐阅读
- c - 为什么我的删除节点功能不适用于二叉搜索树?
- python-3.x - Python 类型提示:自引用类型检查
- python-3.x - 在请求中运行后台异步任务而不在 pytest-sanic 中关闭事件循环
- c# - 反正有没有降低算法c#的复杂度
- php - 如何在 Wordpress 摘录中使用 HTML 代码
- cuda - 块维度等数据在内存中存储在哪里。(CUDA编程)?
- python - Python GUI登录数据库
- c# - 试图查找文件中逻辑语句的数量
- android - Android:如何以编程方式检查 WhatsApp 上的号码是否在线?
- django - 将 django 站点部署到 elasticbeanstalk:NotAuthorizedError:操作被拒绝。请求中包含的安全令牌无效