构造一个定义有不定数量参数的矩阵

Constructing a matrix defined with an indefinite number of parameters

我正在尝试获取值矩阵。我首先尝试解释(希望清楚)矩阵需要如何组成。该矩阵由具有不定数量参数的子矩阵构成。 例如,我插入一个只有 3 个参数的子矩阵:

a1, a2, a3, b1, b2, b3

根据这些值,我想构建一个类型的矩阵:

[['a1', 'a2', 'a3'],
 ['b1', 'a2', 'a3'],
 ['a1', 'b2', 'a3'],
 ['a1', 'a2', 'b3']]

从第二行开始,我将有一条对角线值 b

我的目标是创建一个脚本,它可以根据传递的参数数量从子矩阵构建到矩阵,但遵循相同的逻辑。

我构建了一个示例字典:

RDesign = { 
"par1" : {"a": ["a11", "a12", "a13"],
        "b": ["b11", "b12", "b13"]},
"par2" : {"a": ["a21", "a22", "a23"],
        "b": ["b21", "b22", "b23"]},
"par3" : {"a": ["a31", "a32", "a33"],
        "b": ["b31", "b32", "b33"]},
}

这本字典与我正在使用的字典相似,它显示 a1 和 b1 是同一参数 (par1) 值的一部分。这对我要求的目的来说并不重要。 在这个示例中,我有 3 个参数(par1、par2、par3),它们被分配了两个类别的值“a”和“b”。该示例包含多个值(a11、a12 等),但为简单起见,我将只考虑第一个 [0](a11、b11、b21 ... b31)。

此函数生成子矩阵的值:

def submat(dict_):
    sub_matrix = []
    for key in dict_:
        A = dict_[key]["a"][0]
        sub_matrix.append(A)
    for key in dict_:
        B = dict_[key]["b"][0]
        sub_matrix.append(B)
    return sub_matrix

sub_M = submat(RDesign)

sub_M

Out[84]: ['a11', 'a21', 'a31', 'b11', 'b21', 'b31']

为了阐明我想要达到的结果,因此我通过“手动”输入值创建了一个数组。

iteration = [[sub_M[0], sub_M[1], sub_M[2]], 
    [sub_M[3], sub_M[1], sub_M[2]],
    [sub_M[0], sub_M[4], sub_M[2]],
    [sub_M[0], sub_M[1], sub_M[5]]]

所以最终结果应该是这样的:

iteration
Out[85]: 
[['a11', 'a21', 'a31'],
 ['b11', 'a21', 'a31'],
 ['a11', 'b21', 'a31'],
 ['a11', 'a21', 'b31']]

目标是以自动方式创建这种类型的矩阵,并且在传递多个参数时也遵循相同的逻辑。我希望我已经说清楚了,但我准备修改消息以尝试更好地解释它。

逻辑并不完全清楚,但要从 sub_M 列表中获取最终输出,您可以使用:

import numpy as np
sub_M = ['a11', 'a21', 'a31', 'b11', 'b21', 'b31']

N = 3  # half size of sub_M, can be computed as len(sub_M)//2

a = np.tile(sub_M[:N], (N+1,1))
np.fill_diagonal(a, sub_M[N:])
a = np.roll(a, 1, axis=0)

输出:

[['a11' 'a21' 'a31']
 ['b11' 'a21' 'a31']
 ['a11' 'b21' 'a31']
 ['a11' 'a21' 'b31']]