You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python创建指定形式的(稀疏)堆叠对角块矩阵?

构建特定分块矩阵M的实现方案

需要构建结构如下的分块矩阵M(维度3m × 3p):

M = [
 [a₁,  0,   0  ],
 [0,  b₁,  0  ],
 [0,   0,  c₁ ],
 [a₂,  0,   0  ],
 [0,  b₂,  0  ],
 [0,   0,  c₂ ],
 ...
]

其中aᵢ、bᵢ、cᵢ均为1×p的行块。已知输入为三个m×p矩阵:

  • A的第i行是aᵢ的转置,即aᵢ = A[i, :].reshape(1, p)
  • B的第i行是bᵢ的转置
  • C的第i行是cᵢ的转置

要求实现时尽可能避免循环或列表推导,优先提供SciPy稀疏矩阵方案,同时给出NumPy稠密矩阵实现。


一、NumPy稠密矩阵实现(无循环)

利用切片赋值直接完成,全程无循环或列表推导,代码简洁高效:

import numpy as np

# 假设A、B、C已定义,形状均为(m, p)
m, p = A.shape

# 初始化全零矩阵
M = np.zeros((3 * m, 3 * p))

# 按切片赋值,对应M的指定行和列块
M[0::3, :p] = A       # 第0、3、6...行,前p列赋值A的行(对应a_i)
M[1::3, p:2*p] = B    # 第1、4、7...行,中间p列赋值B的行(对应b_i)
M[2::3, 2*p:] = C     # 第2、5、8...行,最后p列赋值C的行(对应c_i)

二、SciPy稀疏矩阵实现(无循环)

针对大规模数据场景,稀疏矩阵可大幅节省内存。以下通过coo_matrix实现,全程使用向量化操作:

import numpy as np
from scipy.sparse import coo_matrix, csr_matrix

# 假设A、B、C已定义,形状均为(m, p)
m, p = A.shape

# 收集A对应的行索引、列索引和值
rows_A = np.arange(m) * 3
cols_A = np.tile(np.arange(p), m)
vals_A = A.flatten()

# 收集B对应的行索引、列索引和值
rows_B = np.arange(m) * 3 + 1
cols_B = np.tile(np.arange(p, 2*p), m)
vals_B = B.flatten()

# 收集C对应的行索引、列索引和值
rows_C = np.arange(m) * 3 + 2
cols_C = np.tile(np.arange(2*p, 3*p), m)
vals_C = C.flatten()

# 合并所有数据
rows = np.concatenate([rows_A, rows_B, rows_C])
cols = np.concatenate([cols_A, cols_B, cols_C])
vals = np.concatenate([vals_A, vals_B, vals_C])

# 创建COO格式稀疏矩阵,可按需转换为CSR/CSC格式(CSR适合矩阵乘法)
M_sparse = coo_matrix((vals, (rows, cols)), shape=(3*m, 3*p))
M_sparse_csr = M_sparse.tocsr()

内容的提问来源于stack exchange,提问作者MarkFloatingInSpace

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 09:02:57