如何将 Numpy Eig 与 Python Lambda 函数一起使用?

Posted

技术标签:

【中文标题】如何将 Numpy Eig 与 Python Lambda 函数一起使用?【英文标题】:How to use Numpy Eig with Python Lambda function? 【发布时间】:2021-06-22 01:54:49 【问题描述】:

我可以将 lambda 函数与 numpy 的 eig 函数一起使用吗?

测试题:

import numpy as np
class c1:
    def __init__(self):
        self.mat1 = lambda num1:np.array([[num1,2],[3,4]])
        self.mat2 = np.array([[1,2],[3,4]])
        self.eigVal, self.eigVec = lambda num1:np.linalg.eig(self.mat2+self.mat1(num1))
    def func1(self):
        print(self.mat1(10))
        print(self.eigVal(10))
c1().func1()       

错误是TypeError: cannot unpack non-iterable function object

【问题讨论】:

lambda 是一个函数,当你调用它时,会生成一个包含两个数组的数组。你不能直接在课堂上解压,但你可以做类似self.eigFunc = lambda num1: np.linalg.eig(self.mat2 + self.mat1(num1)) 的事情,然后在以后解压结果eigval, eigvec = self.eigFunc(10) 有趣的是,answer 说您可以使用 lambda 返回两个值。但在我的例子中,我不能。当我采纳你的建议时,它的工作。谢谢。 lambda 调用时可以返回 2 个值,但 lambda 本身是一个对象。 谢谢,@hpaulj。现在我理解了lambda的不可迭代结构,因为我从下面的代码中得到了错误。 self.eigFunc = lambda num1: np.linalg.eig(self.mat1(num1)); self.eigenVal = lambda num1 : self.eigFunc(num1) 【参考方案1】:

此代码将获取每个矩阵的特征值和特征向量:

import numpy as np

class c1:
    def __init__(self):
        self.mat1 = np.array([[11,21],[31,41]])
        self.mat2 = np.array([[1,2],[3,4]])
        
        mat1_vals, mat2_vals = list(map(lambda mat: np.linalg.eig(mat), [self.mat1, self.mat2]))
        
        self.eigVal = [mat1_vals[0], mat2_vals[0]]
        self.eigVec = [mat1_vals[1], mat2_vals[1]]
        
        print('Eig Vals: ', self.eigVal)
        print('Eig Vecs:', self.eigVec)

if __name__=='__main__':
    c1()

输出

Eig Vals:  [array([-3.59729717, 55.59729717]), array([-0.37228132,  5.37228132])]
Eig Vecs: [array([[-0.82111408, -0.42601354],
       [ 0.57076411, -0.90471679]]), array([[-0.82456484, -0.41597356],
       [ 0.56576746, -0.90937671]])]


需要注意的是,您必须在某些iterable 对象上map lambda 函数,然后将map 对象转换为可迭代才能使用它。

干杯。

【讨论】:

感谢您的回答。据我所知,没有任何简单的方法可以用 lambda 函数递归调用 eig 函数。我的意思是,我的基本代码有 NxN 矩阵。 不客气,希望对您有所帮助,但我真的不明白在这种情况下recursively 是什么意思。在这种情况下,您的限制是什么?我的意思是执行时间还是可读性或内存资源?您应该在问题中解释所有这些,因为它不是很清楚。 在您的回答中,self.mat1 是不变的,但在我的问题中,我尝试将 lambda 放在 self.mat1 的第一个元素中。我想要的是编写一个 lambda 函数,它取决于 self.mat1 矩阵的第一个值,然后我想找到 self.mat 矩阵的特征值。我说recursively,因为我为self.mat1 定义了一个lambda 函数,然后我尝试创建一个调用另一个lambda 函数的lambda 函数。不是递归的意思吗? Recursive 表示您在侧函数x 本身中调用函数x,在您的情况下self.mat1__init__ 的第一行创建,然后在第3 行您尝试将新创建的lambda 再次分配给两个变量self.eigValself.eigVec,但失败了。然后在整数10 上调用c1::func1 方法。我真的没有在这里看到递归,对不起。此外,要使用递归,您必须定义停止条件,以防止代码中也缺少无限递归。 哦,我明白了。再次感谢您的解释。【参考方案2】:

感谢@pietro。这个comment给出了解决方案。

这是我的工作解决方案。

import numpy as np
class c1:
    def __init__(self):
        self.mat1 = lambda num1:np.array([[num1,2],[3,4]])
        self.mat2 = np.array([[1,2],[3,4]])
        self.eigFunc = lambda num1: np.linalg.eig(self.mat2 + self.mat1(num1))
    def func1(self):
        eigval, eigvec = self.eigFunc(10)
        print(eigval)
c1().func1()

【讨论】:

以上是关于如何将 Numpy Eig 与 Python Lambda 函数一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

转:numpy.linalg.eig() 计算矩阵特征向量

对于 Hermitian 矩阵,numpy.linalg.eig 给出的结果与 numpy.linalg.eigh 不同

为啥用 numpy 计算 2×2 矩阵的特征向量会使我的 Python 会话崩溃?

Numpy EIG 在 Mac OS X 10.6 上比 MATLAB EIG 慢大约 4 倍。我究竟做错了啥?

python numpy 特征值 特征向量 算的不对啊,求救!

如何在 Python 中从 Numpy 矩阵创建列表