python - 在 Python 中创建对称矩阵索引值
问题描述
我有一个矩阵上三角形的列和值列表,我想将其转换为对称矩阵。例如,我有
UpperTriangle = [[[0, 5], [6.0, 4.0]],
[[1, 3], [9.0, 6.0]],
[[2, 4, 6], [9.0, 6.0, 6.0]],
[[3], [4.0]],
[[4, 6], [4.0, 4.0]],
[[5], [2.6666666666666665]],
[[6], [4.0]]]
我想把它转换成
Symmetric = [[[0, 5], [6.0, 4.0]],
[[1, 3], [9.0, 6.0]],
[[2, 4, 6], [9.0, 6.0, 6.0]],
[[1, 3], [6.0, 4.0]],
[[2, 4, 6], [6.0, 4.0, 4.0]],
[[0, 5], [4.0, 2.6666666666666665]],
[[2, 4, 6], [6.0, 4.0, 4.0]]]
第一个列表与矩阵的第一行有关,列表中的第一个列表给出列索引,第二个列表给出与列索引有关的值。第二个列表属于第二行,依此类推。在上面的例子中,(row=0, column=0) 的值为 6.0,(row=0,column=5) 的值为 4.0,(row=1,column=1) 的值为 9.0,(row=1,column= 3) 值为 6.0。
一种方法是创建一个 numpy 矩阵,然后使用以下方法创建一个对称矩阵。
W = np.maximum( A, A.transpose() )
但这是不可行的,因为实际问题涉及到一个有 350,000 行和列的矩阵,构建一个 numpy 矩阵 A 占用太多内存,转换它需要太多时间。
在不求助于构建 numpy 矩阵(使用 Python 2.7)的情况下,将 UpperTriangle 转换为 Symmetric 的最快 Python 方法是什么?(在合理的内存范围内)。
问题出现在使用 IBM 的 Cplex Python API 的上下文中,您需要在其中插入一个对称矩阵来设置二次方。
import cplex
my_prob = cplex.Cplex()
my_prob.objective.set_quadratic(Symmetric)
my_prob.solve()
解决方案
此处输入的CSR表示非常方便。当您考虑每一行时,您当然会了解对称矩阵的一列。当您到达每一行时,您已经知道从其上三角形形式中省略的所有列的内容。您甚至可以按照它们在该行中出现的顺序了解这些值!
那么这只是一个简单的编程问题:
def sym(up): # alters 'up' in place
pfx=[([],[]) for _ in up] # to be added to each row
for r,((cc,vv),(pc,pv)) in enumerate(zip(up,pfx)):
for c,v in zip(cc,vv):
if c>r: # store off-diagonal for later row
cr,cv=pfx[c]
cr.append(r); cv.append(v)
cc[:0]=pc; vv[:0]=pv # prepend to preserve order
推荐阅读
- node.js - 如何使用 emscripten 通过 node.js 进行文件输入?
- .net - XML 使用带有导入的 XSD 进行验证,并包含在 .net 核心中
- python - 如何按整数对元组的混合列表进行排序?
- sql - BigQuery 嵌套表 UPDATE 基于非嵌套数据和嵌套数据的条件
- bit-manipulation - RISC-V 中的旋转位
- angular - 试图清除 Angular 8 CDK 拖放列表
- sql - 我在更新查询的 sql 触发器中有错误
- php - 自定义根文件夹的 Laravel 重定向问题
- firemonkey - EReadError 与 TColor 在 FMX 中发布的属性
- amazon-web-services - AWS SES 验证的电子邮件