如何将 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.eigVal
和self.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 函数一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
对于 Hermitian 矩阵,numpy.linalg.eig 给出的结果与 numpy.linalg.eigh 不同
为啥用 numpy 计算 2×2 矩阵的特征向量会使我的 Python 会话崩溃?
Numpy EIG 在 Mac OS X 10.6 上比 MATLAB EIG 慢大约 4 倍。我究竟做错了啥?