我有一个问题,我建立一些矩阵取决于,比方说,两个整数参数。我们称它们为A,它取决于p1,p2,其中p1,p2的取值为0到5.
Python中有没有办法将A的特征值和特征向量存储在一个名为B的“对象”中,这样就像B(1,2)[i](或B [1,2,i])这样的东西结果将给出矩阵A build的特征值(对于i = 0)或特征向量(对于i = 1),其中p1 = 1且p2 = 2?
目前我正在做的是将特征向量存储在字典中,如下面的简单示例所示,但我认为这是一个肮脏的黑客。我会很感激
示例:
import numpy as np
# Build A matrices
def Amatrix(p1,p2):
import numpy as np
return np.array([[p1,p2/10],[p2/10,-p1]])
# Empty dict
eigvec_dict = {}
for p1 in range(3):
for p2 in range(2):
label = str(p1)+str(p2)
eigenvec_dict[label] = np.linalg.eigh(Amatrix(p1,p2))
eigenvec_dict.keys()
Out[9]: ['11', '10', '00', '01', '20', '21']
eigenvec_dict["01"][0]
Out[10]: array([-1., 1.])
eigenvec_dict["01"][1]
Out[11]:
array([[-0.70710678, 0.70710678],
[ 0.70710678, 0.70710678]])
答案 0 :(得分:0)
我会使用一个带有一个点列表的对象(我认为一个点比tuple
更好string
)并立即计算eighs
。
__getitem__
被覆盖,返回此[0, 1, 0]
点(0, 1)
的特征值。内部数据结构仍然是一个字典,但它包装在一个对象中,可以很好地从外部调用。
import numpy as np
# class to store eigen values / vectors
class EigenH(object):
def __init__(self, points):
self.eighstore = self._create_eighstore(points)
def _create_eighstore(self, points):
eighstore = {}
for point in points:
eighs = np.linalg.eigh(self._get_amatrix(point))
eighstore[point] = eighs
return eighstore
def _get_amatrix(self, point):
p1, p2 = point
return np.array([[p1,p2/10.],[p2/10.,-p1]])
def __getitem__(self, key):
return self.eighstore[key[:2]][key[2]]
def keys(self):
return self.eighstore.keys()
# create point list
points = []
for p1 in range(3):
for p2 in range(2):
# I prefer tuples over strings in this case
points.append((p1, p2))
# instantiate class
eigh = EigenH(points)
# get eigen value
print(eigh[0, 1, 0])
#get eigen vectors
print(eigh[0, 1, 1])
# all available eighs
print(eigh.keys())