2017-02-14 6 views
2

私は、2つの整数パラメータに応じていくつかの行列を作成するのに問題があります。 p1、p2が0から5までの値を取るp1、p2に依存するそれらをAと呼ぶことにしよう。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'の2次元配列を作成し、各セルにEvalsとEvecsを含む 'namedtuple'を格納する必要があるかどうかです。 –

+0

こんにちは、Currixとサイトにようこそ。私たちは一般的に質問をナットとボルトの詳細にとどめようとしていますので、私はあなたのことをちょっとはずしました。 – MackM

+0

あなたの助けとトリミングのおかげでありがとう。 – Currix

答えて

0

私はポイントのリストを取る(私はポイントがstringよりtuple優れていると思います)、すぐにeighsを算出し、オブジェクトを使用します。私は、任意の

例をいただければ幸いです。

__getitem__は、[0, 1, 0]点の固有値である(0, 1)を返します。内部データ構造は依然としてdictですが、オブジェクトにラップされ、外側からうまく呼び出すことができます。

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

関連する問題