如何解决收到错误:无法将表达式转换为浮点数
我是python的新手,我试图在表面上找到Christoffel symbols的黎曼度量标准,但出现了以下错误: TypeError:无法将表达式转换为浮点型。为简单起见,我编写了另一个错误完全相同的代码(我的基本代码很长且不可读,因此我尝试使用此示例代码来了解我的错误)。这是我的示例代码:
from sympy import *
import numpy as np
coor = symbols('x y')
x = [coor[0] ** 2,coor[1]]
christoffels = np.zeros((2,2))
for i in range(2):
for j in range(2):
christoffels[i][j] = x[i] * x[j]
print(christoffels)
您能告诉我出什么事了吗?
解决方法
作业存在多个问题:
christoffels[i][j] = x[i] * x[j]
在右侧,我们有symbols
,在左侧,我们有NumPy floats数组单元格。
因此,Python很难将symbols
转换为浮点数。
TypeError: can't convert expression to float
让我们通过将矩阵定义为sympy
matrix来解决此问题:
from sympy import *
import numpy as np
coor = symbols('x y')
x = [coor[0] ** 2,coor[1]]
# Create sympy array
christoffels = zeros(2,2)
for i in range(2):
for j in range(2):
# Now assignment works
# NOTE: In sympy location denoted as [i,j] and not [i][j]
christoffels[i,j] = x[i] * x[j]
# Matrix([[x**4,x**2*y],[x**2*y,y**2]])
print(christoffels)
,
在 select p.*,coalesce(
exp(
sum(ln(s.adjustment))
over (partition by p.ticker
order by p.ddate desc
rows between unbounded preceding
and 1 preceding)
),1
) * p.unadj as adjusted
from prices p
left join splits s
on s.ticker = p.ticker
and s.split_date = p.ddate;
ticker | ddate | unadj | adjusted
--------+------------+--------+------------------------
AAPL | 2020-09-01 | 134.18 | 134.18
AAPL | 2020-08-31 | 129.04 | 129.04
AAPL | 2020-08-28 | 499.23 | 124.807500000000000000
AAPL | 2020-08-27 | 500.04 | 125.010000000000000000
AAPL | 2020-08-26 | 506.09 | 126.522500000000000000
(5 rows)
会话中(已经定义了isympy
,x
)
y
In [1]: coor = symbols('x y')
In [2]: coor
Out[2]: (x,y)
是一个元组
coor
In [3]: xx = [coor[0]**2,coor[1]]
In [4]: xx
Out[4]:
⎡ 2 ⎤
⎣x,y⎦
是一个包含2个sympy对象的列表。
如果我们创建对象dtype数组,则可以分配sympy元素:
xx
或者创建列表的理解方式
In [5]: xy = np.empty((2,2),object)
In [6]: for i in range(2):
...: for j in range(2):
...: xy[i,j] = xx[i]*xx[j]
...:
In [7]: xy
Out[7]:
array([[x**4,y**2]],dtype=object)
作为嵌套列表,然后像以前一样排列:
In [8]: [[i*j for j in xx] for i in xx]
Out[8]:
⎡⎡ 4 2 ⎤ ⎡ 2 2⎤⎤
⎣⎣x,x ⋅y⎦,⎣x ⋅y,y ⎦⎦
对象dtype数组经常出现在SO问题上,但通常是在创建“参差不齐”的数组时出现。它们没有数字dtype数组的速度或计算能力。
只要元素本身实现正确的方法(例如加法),某些基本数学就可以使用对象dtype数组
In [9]: np.array(_)
Out[9]:
array([[x**4,dtype=object)
(没有人实现In [10]: xy.sum(axis=1)
Out[10]: array([x**4 + x**2*y,x**2*y + y**2],dtype=object)
In [11]: np.exp(xy)
...
TypeError: loop of ufunc does not support argument 0 of type Pow which has no callable exp method
方法。)
exp
在sympy
中运行,因此基本的python结构(如元组和列表)是很自然的。与python
的交互是命中注定的,从来没有像纯数字数组那样快。 numpy
自己的矩阵/数组导入通常会为您提供更多功能,但需要更多研究。
另一个答案中给出的sympy's
对象:
sympy.Matrix
也可以从嵌套列表中构造:
In [20]: zz = zeros(2,2)
In [21]: for i in range(2):
...: for j in range(2):
...: zz[i,j] = xx[i]*xx[j]
...:
In [22]: zz
Out[22]:
⎡ 4 2 ⎤
⎢ x x ⋅y⎥
⎢ ⎥
⎢ 2 2 ⎥
⎣x ⋅y y ⎦
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。