python - 将子矩阵插入 scipy 稀疏矩阵
问题描述
如何有效地将特定位置的子矩阵插入我的稀疏矩阵?另外,对于这种增量构造,推荐使用哪个 scipy 稀疏矩阵类?
更具体地说,如何在下面的代码中填充矩阵 M?
def rrd(mesh, rel_rotations, neighbors, R_0):
M = scipy.sparse.lil_matrix((N_FACES*9*3,N_FACES*9))
for i in range(0,N_FACES*27,27):
for j in range(3):
for k in range(0,N_FACES*9,9):
M[i+j*9:i+(j+1)*9,k:k+9] = -np.eye(9)
for i in range(len(rel_rotations)):
diagonals = [
rel_rotations[i][0][2],
np.append(rel_rotations[i][0][1].repeat(3), rel_rotations[i][1][2].repeat(3)),
np.append(rel_rotations[i][0][0].repeat(3), np.append(rel_rotations[i][1][1].repeat(3),
rel_rotations[i][2][2].repeat(3))),
np.append(rel_rotations[i][1][0].repeat(3), rel_rotations[i][2][1].repeat(3)),
rel_rotations[i][2][0].repeat(3)
]
diag_rel_rotations = scipy.sparse.diags(diagonals, [-6,-3,0,3,6], shape=(9,9)).todense()
mod = i % 3
div = int((i-mod)/3)
n_idx = neighbors[div][mod]
M[i+mod*9:i+(mod+1)*9][n_idx*9:(n_idx+1)*9] = diag_rel_rotations
切片在这里不起作用,我查看了一些不同类型的稀疏矩阵,但无法确定哪个适合这个问题。
解决方案
lil
是正确的分配。
In [553]: M = sparse.lil_matrix((9,9), dtype=int)
In [554]: M
Out[554]:
<9x9 sparse matrix of type '<class 'numpy.int64'>'
with 0 stored elements in LInked List format>
In [555]: M[2:5, 3:6] = np.eye(3)
In [556]: M
Out[556]:
<9x9 sparse matrix of type '<class 'numpy.int64'>'
with 3 stored elements in LInked List format>
In [557]: M.A
Out[557]:
array([[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0]])
In [558]: d = sparse.diags([[1,2],[1,2,3],[2,3]], [-1,0,1])
In [562]: M[0:3, 6:9] = d
推荐阅读
- ios - 日期格式化程序返回未识别的日期
- octobercms - 根据关系更改后端字段显示 - OctoberCMS
- aws-api-gateway - 创建私有 API
- javascript - 从 Chrome 开发者工具中复制 HTML 元素对象
- java - 如何在 Java 中自动执行跟踪关注点
- powerbi - 尝试使用 IF 语句构建列时出错
- data-structures - 两个链表的区别
- visual-studio - 你可以在 Visual Studio 中订购分支吗
- sql - 将 Double Inner Join SQl 查询转换为 LINQ
- java - linux上哪里可以找到java虚拟机日志