Python数据结构:参数依赖数组

时间:2017-02-14 15:43:50

标签: python numpy

我有一个问题,我建立一些矩阵取决于,比方说,两个整数参数。我们称它们为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]])

1 个答案:

答案 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())