scipy 如何在Python中的另一个函数中调用相同的参数N次

b5lpy0ml  于 2023-08-05  发布在  Python
关注(0)|答案(1)|浏览(101)

此问题在此处已有答案

Expanding tuples into arguments(5个答案)
16天前关闭
我有一个函数,可以接受可变数量的参数。我想让另一个函数用一个参数重复n次调用这个函数。具有可变参数的函数是scipy.linalg.block_diag,它创建一个块对角矩阵,其输入沿着对角线。调用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):
    """
    This function generates a block diagonal matrix by repeating the input 
    matrix along the diagonal.

    Args:
        matrix: The input matrix.
        NDimen: The number of times the matrix should be repeated along the 
        diagonal.

    Returns:
        BlockDiagMat: The resulting block diagonal matrix obtained by 
        repeating the input matrix along the diagonal.
    """

    BlockDiagMat = block_diag(matrix, matrix, matrix, matrix, matrix, matrix, matrix)
    return BlockDiagMat

block_diagonal_matrix(mat, NDim)

字符串
通过在调用block_diag时手动重复矩阵7(NDim)次,我获得了正确的块对角矩阵。但是,我希望有一种方法可以让block_diagonal_matrix函数调用matrix适当的次数。
我试着在函数中调用block_diag:

BlockDiagMat = block_diag(matrix*NDimen)


然而,得到的块对角矩阵没有正确的内部维度(期望len(BlockDiagMat [0])为21,得到3)。
我也试着先把矩阵做成一个列表:

BlockDiagMat = block_diag([matrix]*NDimen)


但是scipy.linalg.block_diag不支持这个:ValueError:以下位置中的参数的维数大于2:[1][2][3]
然后我尝试使用numpy.ndarray.flatten进行扁平化,但是生成的矩阵没有正确的维度。
这一切都归结为使用block_diagonal_matrix在scipy.linalg.block_diag中调用矩阵n次。
先谢谢你的帮助。

stszievb

stszievb1#

试试这个:

BlockDiagMat = block_diag(*[matrix]*NDimen)

字符串
一般来说,在函数中重复n次参数:

func(*[arg]*n)


首先创建一个包含参数[arg]的列表
然后将其相乘,使参数的次数正确[arg]*n
然后将该列表解压缩到函数中,以便实际上将参数作为多个参数提供给函数,而不是单个列表*[arg]*n

相关问题