【问题标题】:numpy.linalg.eigh works with numpy array from sym.lambdify() but not from np.array()numpy.linalg.eigh 适用于来自 sym.lambdify() 的 numpy 数组,但不适用于来自 np.array()
【发布时间】:2020-05-26 23:52:53
【问题描述】:

这是代码。 2a 有效,但 2b 无效,即使两个矩阵具有相同的形状和相同的类型。谁能解释一下?

import sympy as sym  
import numpy as np

x1, x2 = sym.symbols('x1 x2')  
f = 2*x1**2 - 2*x1*x2 + x2**2 + 2*x1 - 2*x2  
xk = np.array([[0 , 1]])  
print("xk shape = ", xk.shape)  
fmat = sym.Matrix([f])  
H = sym.hessian(fmat, (x1, x2))  
print("Symbolic H")  
sym.pprint(H)  

# 2a: Convert the SymPy Matrix to Numpy array using lambdify and then substitute values  
Hnp = sym.lambdify((x1, x2), H, 'numpy')  
Hknp = Hnp(xk[0][0], xk[0][1])  
print("Hknp")  
sym.pprint(Hknp)  
print("Hknp type:", type(Hknp))  
print("Hknp shape = ", Hknp.shape)  
v, Q = np.linalg.eigh(Hknp)  
print("v:", v)  
print("Q:")  
sym.pprint(Q)  

# 2b: Substitute values into SymPy Matrix then convert to Numpy array  
Hks = H.subs([(x1, xk[0][0]), (x2, xk[0][1])])  
Hk = np.array(Hks)  
print("Hk")  
sym.pprint(Hk)  
print("Hk type:", type(Hk))  
print("Hk shape = ", Hk.shape)  
v, Q = np.linalg.eigh(Hk)  
print("v:", v)  
print("Q:")  
sym.pprint(Q)  

【问题讨论】:

  • “不”是什么意思?你应该显示错误!也显示打印。不是每个人都可以运行您的代码来亲自查看这些内容。
  • 天真地将sympy 表达式传递给numpy/scipy 经常会出现问题。在继续之前,您必须仔细检查生成的数组。 lambdify 是安全界面。

标签: python numpy sympy lambdify


【解决方案1】:
>>> Hk
array([[4, -2],
       [-2, 2]], dtype=object)


>>> Hknp.dtype
dtype('int64')

解决方案是Hk = np.array(Hks, dtype=np.int64)

【讨论】:

  • 现在知道 dtype 很重要非常有用。在这种情况下,最好使用浮点数。如果矩阵计算恰好导致浮点数,但我将 dtype 声明为 int64,则 Python(正如人们所期望的那样)截断为整数。
猜你喜欢
  • 1970-01-01
  • 2020-07-09
  • 2020-02-20
  • 1970-01-01
  • 2020-12-19
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多