如何用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
相关产品推荐
相关产品推荐

