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

如何在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),符合预期

错误原因说明

  1. matrix*NDimen:对于列表形式的矩阵,此操作是将矩阵的行重复NDimen次,生成一个更长的二维列表,block_diag会将其视为单个块,因此维度错误。
  2. [matrix]*NDimen:直接传入该列表时,block_diag会把整个列表当作一个参数,而列表内的元素是矩阵,相当于传入了三维结构,触发维度错误。
  3. *[matrix]*NDimen:通过*解包列表,将列表中的每个matrix作为独立参数传递给block_diag,等价于手动写block_diag(matrix, matrix, ..., matrix)(共NDimen次),完全符合函数的参数要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 15:06:27