字典的备份计划(在矩阵诊断中)?

Backup plan for dictionary (in matrix diagnalization)?

我正在使用 Python 编写代码来查找两个矩阵 A 和 B 的共享特征值和特征向量,在我的例子中,这两个矩阵都与条目 1 成非对角线。因此,共享特征值是1,1,-1,-1。我希望程序可以 return 每个特征值与所有特征向量,这意味着 1 和 -1 都有 2 'values' (特征向量)。但是,使用字典,我不能为一个键提供两个值。这是我的代码,我该如何解决?我还可以使用 'dictionary' 来实现吗?谢谢!

def simultaneous_eig1(A, B):
    epsilon = 10**-10
    vals, vecs = la.eig(A)
    degen = {}
    print(vals)
    print(vecs)
    for n in range(0, len(vals)):
        for m in range(0, len(vals)):
            # equality up to certain precision
            if np.abs(vals[m] - vals[n]) < epsilon and m != n:
                degen.get(vals[m], vecs[:,n])
        degen[vals[n]] = np.array([vecs[:,n]])
    return degen

您可以指定一个列表作为字典项的值:

degen[vals[n]] = []  # do this once for each key

... 然后将实际值附加到该列表:

degen[vals[n]].append(np.array([vecs[:,n]]))

复杂的是第一次遇到key需要创建空列表;如果已经存在,则需要跳过列表初始化。

您可以使用 dict.setdefault():

来解决这个问题
degen.setdefault(vals[n], []).append(np.array([vecs[:,n]]))

为清楚起见,将复杂的值分配给更简单的表达式是惯例,例如:

value = np.array([vecs[:,n]])
degen.setdefault(vals[n], []).append(value)

需要为每个特征值调用最后一行。


如果值不重复且顺序无关紧要,您还可以使用 set() 而不是 []。然后,您必须将 append 替换为 add(参见 docs)。