【问题标题】:'matrix' object has no attribute 'eigenvals'“矩阵”对象没有属性“特征值”
【发布时间】:2021-11-01 17:32:37
【问题描述】:

我有以下代码

import numpy as np
import sympy as sp

def bra(i,d):
    arr = np.zeros((1,d))
    if i <= (d-1):
        arr[:,i] = 1
    else:
        print("Index Out of bounds")
    return arr

def density(i,j,d):
    return bra(i,d).T*bra(j,d)

SIGMA = (1/3)*(np.kron(np.kron(bra(0,3),bra(1,3)).T,np.kron(bra(0,3),bra(1,3)))+np.kron(np.kron(bra(1,3),bra(2,3)).T,np.kron(bra(1,3),bra(2,3)))+np.kron(np.kron(bra(2,3),bra(0,3)).T,np.kron(bra(2,3),bra(0,3))))

DELTA = (1/3)*(np.kron(np.kron(bra(1,3),bra(0,3)).T,np.kron(bra(1,3),bra(0,3)))+np.kron(np.kron(bra(2,3),bra(1,3)).T,np.kron(bra(2,3),bra(1,3)))+np.kron(np.kron(bra(0,3),bra(2,3)).T,np.kron(bra(0,3),bra(2,3))))

本质上,bra(i,d) 给出了一个 (1,d) 数组,其中第 (1,i) 个元素为 1,其余元素为 0。例如,

 bra(0,3)=[[1,0,0]]
bra(1,3)=[[0,1,0]] 
bra(0,3)=[[0,0,1]]

density(i,j,d) 返回 (d,d) 矩阵,第 (i,j) 个元素为一,其余为零,例如,

 density(0,1,3) = array([[0., 1., 0.], [0., 0., 0.],[0., 0., 0.]]).

使用上面的代码,我使用 np.kron 生成了一个 (9,9) Matrix 对象

a = sp.symbols('a', positive = True)

HORO = (2/21)*(np.kron(density(0,0,3),density(0,0,3))+np.kron(density(1,0,3),density(0,1,3))+np.kron(density(0,0,3),density(2,2,3))
+np.kron(density(0,1,3),density(1,0,3))+np.kron(density(1,1,3),density(1,1,3))+np.kron(density(2,1,3),density(1,2,3))
+np.kron(density(0,2,3),density(2,0,3))+np.kron(density(1,2,3),density(2,1,3))+np.kron(density(2,2,3),density(2,2,3)))+(a/7)*SIGMA+((5-a)/7)*DELTA

M = np.asmatrix(HORO)

可以证明 M 矩阵是可逆的 是下面的(9,9)矩阵

matrix([[0.0952380952380952, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0.0476190476190476*a, 0, 0.0952380952380952, 0, 0, 0, 0, 0],
        [0, 0, 0.333333333333333 - 0.0476190476190476*a, 0, 0, 0,
         0.0952380952380952, 0, 0],
        [0, 0.0952380952380952, 0,
         0.238095238095238 - 0.0476190476190476*a, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0.0952380952380952, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0.0476190476190476*a, 0, 0.0952380952380952, 0],
        [0, 0, 0, 0, 0, 0, 0.0476190476190476*a, 0, 0],
        [0, 0, 0, 0, 0, 0.0952380952380952, 0,
         0.238095238095238 - 0.0476190476190476*a, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0.0952380952380952]], dtype=object)

对于这个符号矩阵,我想将特征值计算为

M.eigenvals()

但是,它返回以下错误

AttributeError: 'matrix' object has no attribute 'eigenvals'

我不知道出了什么问题。

【问题讨论】:

  • M 到底是什么?向我们展示其 eigenvals 方法的文档。换句话说,证明该代码的合理性。
  • 我不确定如何证明代码的合理性。它被编写来产生一个可逆矩阵,我想要它的特征值。尽管如此,我还是尽可能地解释了代码的点点滴滴
  • 我不是在问why。我想让你证明那个类的一个对象有那个方法。在 Python 中,每个对象类都有一组已定义的方法。如果你使用了错误的方法,或者有错误的对象类,你会得到这种attribute 错误。您不能向list 询问其keys,就好像它是dict。你不能appenddict
  • 好的,我会切入正题。 sympy.Matrix 对象确实有 eigenvals 方法。 docs.sympy.org/latest/tutorial/…np.matrix 类没有! numpy.org/doc/stable/reference/generated/numpy.matrix.html。不要在没有密切关注他们的文档的情况下混搭 sympynumpy
  • 好的。我明白了,我需要一个 sympy.matrix 对象。谢谢。

标签: python-3.x numpy matrix sympy eigenvalue


【解决方案1】:

通常,numpy 和 sympy 不能很好地混合。 Numpy 不能使用 sympy 函数和符号。此外,sympy 尝试计算精确的符号解,这与浮点数不能很好地结合使用(sympy 强烈喜欢整数、有理数和符号表达式,例如 sp.sqrt())。

在这种情况下,只要您没有进行太多更改,numpy 就可以很好地计算矩阵元素(求和和乘积通过底层标准 Python 执行)。

现在,如果您只在 sympy 中使用该矩阵,您会得到:

M = sp.Matrix(HORO)
print(M.eigenvals())

你得到:

 {0.0952380952380952: 3,
  0.119047619047619 - 0.152455338986496 * sqrt(0.0975609756097561 * a ** 2 - 0.48780487804878 * a + 1.0): 2,
  0.152455338986496 * sqrt(0.0975609756097561 * a ** 2 - 0.48780487804878 * a + 1.0) + 0.119047619047619: 2,
  0.0476190476190476 * a: 1,
  0.333333333333333 - 0.0476190476190476 * a: 1}

更好的方法是使用nsimplify 将浮点数转换为有理数:

M = sp.Matrix(sp.nsimplify(HORO))
print(M.eigenvals())

这给出了一个更好的符号解决方案:

{2 / 21: 3,
 5 / 42 - sqrt(4 * a ** 2 - 20 * a + 41) / 42: 2, 
 sqrt(4 * a ** 2 - 20 * a + 41) / 42 + 5 / 42: 2,
 a / 21: 1,
 1 / 3 - a / 21: 1}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 2016-11-29
    • 2019-04-27
    • 1970-01-01
    • 2012-08-08
    • 2012-03-18
    • 1970-01-01
    相关资源
    最近更新 更多