2017-02-14 49 views
2

我有一個問題,我建立一些矩陣取決於,比方說,兩個整數參數。我們稱它們爲A,它依賴於p1,p2,其中p1,p2取值爲0到5.Python的數據結構:參數相關陣列

Python中是否有方法將A的特徵值和特徵向量存儲在名爲B的「對象」中那麼類似B(1,2)[i](或B [1,2,i])的結果將給出矩陣A的特徵值(對於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

我會使用一個數組作爲參數。要麼你可以爲Evals創建一個3d數組,或者爲Evecs創建一個4d數組,或者如果你必須一起創建一個「dtype = object」的二維數組並在每個單元格中存儲一個包含Evals和Evecs的'namedtuple'。 –

+0

你好Currix並歡迎來到該網站。我們通常會試着將問題保留在細節部分,所以我將它們修剪了一下。 – MackM

+0

感謝您的幫助和修剪。 – Currix

回答

0

我會用一個對象,需要點名單(我認爲關鍵是更好的一個tuplestring),並立即計算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()) 
+0

謝謝。對我來說似乎是一個非常好的解決方案。我不習慣上課,但我會閱讀有關它。如果我在每次評估eigen_util [a,b,c]或eigen_util [a,b]時都已正確理解,則執行np.linalg.eigh(Amatrix(a,b))的對角化。在這種情況下,這不是問題,但我希望執行一次所有必要的對角化操作,保存結果並稍後訪問它們。 – Currix

+0

是的,我認爲知道類是有用的:)無論如何,當你調用eigen_util [1,1,1]時,「eigh」計算是正確的。您可以創建一個類「B」來計算創建時的特徵。所以你可以在循環中啓動它們。我會盡快更新我的答案。 – ppasler

+0

@Currix我已經更新了我的答案。 – ppasler