【问题标题】:eig(a,b) in Python giving error "takes 1 positional argument but 2 were given"Python中的eig(a,b)给出错误“需要1个位置参数,但给出了2个”
【发布时间】:2019-06-09 00:24:04
【问题描述】:

根据https://docs.scipy.org/doc/numpy-1.15.0/user/numpy-for-matlab-users.html,MATLAB [V,D]=eig(a,b) 的等效 numpy 表达式是V,D = np.linalg.eig(a,b)

但是当我尝试这个时,我得到了错误:

TypeError: eig() takes 1 positional argument but 2 were given

我很困惑,文档说np.linalg.eig 可以接受两个参数?

奇怪的是,当我查看 https://docs.scipy.org/doc/numpy-1.15.1/reference/routines.linalg.htmllinalg 文档时,在标题“矩阵特征值”下没有提到 linalg.eig 接受两个参数?

如何让eig 像在 MATLAB 中一样采用两个参数?

这适用于 MATLAB

a = diag(ones(3,1));
b = diag(2*ones(3,1));
[V,D] = eig(a,b)

输出:

V =

    0.7071         0         0
         0    0.7071         0
         0         0    0.7071


D =

    0.5000         0         0
         0    0.5000         0
         0         0    0.5000

这在 Python 中不起作用

import numpy as np

a = np.diag(np.ones(3))
b = np.diag(2*np.ones(3))

V,D = np.linalg.eig(a,b)

错误:

TypeError: eig() takes 1 positional argument but 2 were given

【问题讨论】:

  • 我已经在文档中打开了一个拉取请求来修复这个问题,希望它会在下一个版本中得到修复。
  • @AndrasDeak,从 1.16 开始,它仍在文档中。我在github.com/numpy/numpy/issues/13596开了一个新问题#13596@
  • 只是为了绕圈子,@AustinDowney,当我说“下一个版本”时,我的意思是“撰写本文时的下一个版本”。当被问到这个问题时,numpy 1.16 是全新的,并且很少重建文档(有docs.scipy.org/doc/numpy-1.16.0/user/…,但没有docs.scipy.org/doc/numpy-1.16.2/user/…)。我希望从 1.17 开始会有变化。这种变化可能被认为不够重要,不值得早点引入(我可以同意)。

标签: python matlab numpy eigenvalue eigenvector


【解决方案1】:

正如您在 numpy.linalg.eig 的文档中看到的,它只接受单个数组参数,因此它不计算广义特征值问题。

幸运的是我们有scipy.linalg.eig:

scipy.linalg.eig(a, b=None, left=False, right=True, overwrite_a=False, overwrite_b=False, check_finite=True, homogeneous_eigvals=False)

    Solve an ordinary or generalized eigenvalue problem of a square matrix.

这是您的示例:

import numpy as np 
import scipy.linalg 

a = np.diag(np.ones(3)) 
b = np.diag(2*np.ones(3)) 
eigvals,eigvects = scipy.linalg.eig(a, b) 

现在我们有

>>> eigvals
array([0.5+0.j, 0.5+0.j, 0.5+0.j])

>>> eigvects
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

特征向量的差异可能是由于对特征值的归一化选择不同。我会检查两个非平凡矩阵,看看结果是否相互对应(当然是比较相应的特征值-特征向量对)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-04
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多