字典的备份计划(在矩阵诊断中)?
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)。
我正在使用 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)。