如何在Python中让函数重复调用同一参数N次(以block_diag为例)
动态生成重复块的对角矩阵
问题背景
需要实现一个函数,传入矩阵和重复次数N,调用scipy.linalg.block_diag生成将该矩阵沿对角线重复N次的块对角矩阵。手动重复参数(如写7次matrix)能得到正确结果,但动态实现时遇到维度错误:
- 尝试
block_diag(matrix*NDimen):生成的矩阵维度不符合预期(期望行长度21,实际仅3) - 尝试
block_diag([matrix]*NDimen):抛出ValueError,提示参数维度超过2
解决方案
利用Python的可变参数解包(*操作符),将重复N次的矩阵列表解包为block_diag的独立参数,和手动重复传入的效果完全一致。
修正后的代码
from scipy.linalg import block_diag mat = [[0.22463041, 0.97444404, 0.], [0.97444404, -0.22463041, 0.], [ 0., 0., 1.]] NDim = 7 def block_diagonal_matrix(matrix, NDimen): """ 该函数通过沿对角线重复输入矩阵生成块对角矩阵。 参数: matrix: 输入矩阵。 NDimen: 输入矩阵沿对角线重复的次数。 返回: BlockDiagMat: 沿对角线重复输入矩阵后得到的块对角矩阵。 """ # 用*解包列表,将每个matrix作为独立参数传入block_diag BlockDiagMat = block_diag(*[matrix]*NDimen) return BlockDiagMat # 调用测试 result = block_diagonal_matrix(mat, NDim) print(f"结果矩阵的维度: {result.shape}") # 输出 (21, 21),符合预期
错误原因说明
matrix*NDimen:对于列表形式的矩阵,此操作是将矩阵的行重复NDimen次,生成一个更长的二维列表,block_diag会将其视为单个块,因此维度错误。[matrix]*NDimen:直接传入该列表时,block_diag会把整个列表当作一个参数,而列表内的元素是矩阵,相当于传入了三维结构,触发维度错误。*[matrix]*NDimen:通过*解包列表,将列表中的每个matrix作为独立参数传递给block_diag,等价于手动写block_diag(matrix, matrix, ..., matrix)(共NDimen次),完全符合函数的参数要求。
内容的提问来源于stack exchange,提问作者ryan
相关产品推荐
相关产品推荐

