获取错误:无法将表达式转换为浮点

2024-09-30 03:25:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python新手,我试图在曲面上找到黎曼度量的Christoffel symbols,但我遇到了以下错误:TypeError:无法将表达式转换为float。为简单起见,我编写了另一个错误完全相同的代码(我的基本代码很长,不可读,因此我尝试使用此示例代码来理解我的错误。下面是我的示例代码:

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)

你能告诉我出了什么问题吗


Tags: 代码inimport示例for度量错误np
2条回答

isympy会话中(其中xy已经定义)

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⎦

xx是一个包含2个Symphy对象的列表

如果我们制作一个对象数据类型数组,我们可以指定sympy元素:

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, x**2*y],
       [x**2*y, 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 ⎦⎦

作为嵌套列表,然后像以前一样排列:

In [9]: np.array(_)
Out[9]: 
array([[x**4, x**2*y],
       [x**2*y, y**2]], dtype=object)

对象数据类型数组经常出现在SO问题上,但通常是在创建“不规则”数组时。它们没有数字数据类型数组的速度和计算能力

只要元素本身实现了正确的方法(如加法),一些基本数学就可以处理对象数据类型数组

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方法。)

sympypython中运行,因此元组和列表等基本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  ⎦

也可以从嵌套列表中构造:

In [23]: Matrix(Out[8])
Out[23]: 
⎡  4    2  ⎤
⎢ x    x ⋅y⎥
⎢          ⎥
⎢ 2      2 ⎥
⎣x ⋅y   y  ⎦

分配有多个问题:

christoffels[i][j] = x[i] * x[j]

右边是symbols,左边是NumPy floats数组单元格

因此Python很难将symbols转换为浮点

TypeError: can't convert expression to float

让我们通过将矩阵定义为^{} 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)

相关问题 更多 >

    热门问题