【问题标题】:Sympy Lambdify with array inputs带有数组输入的 Sympy Lambdify
【发布时间】:2014-07-29 21:00:33
【问题描述】:

我正在尝试将一个数组作为输入,并期望一个数组作为以下代码的输出。

from sympy import symbols
from sympy.utilities.lambdify import lambdify
import os
from sympy import *
import numpy as np

text=open('expr.txt','r')
expr=text.read()
x,param1,param2=symbols('x param1 param2')
params=np.array([param1,param2])
T=lambdify((x,params),expr,modules='numpy')
data=np.genfromtxt('datafile.csv',delimiter=',')
print T(data[0],[0.29,4.5])
text.close()

但是得到以下错误。

TypeError: <lambda>() takes exactly 3 arguments (13 given)

我如何告诉 sympy 它是一个数组?提前致谢。

【问题讨论】:

  • 你想做什么?我在您的代码中看到了很多错误。变量 expr 只是一个字符串而不是表达式。
  • 它是一个在文件中包含 x、param1 和 param2 的数学表达式。在给定 param1 和 param2 的情况下,我正在尝试以不同的 x 值对其进行评估
  • 表达式看起来如何?
  • 2*param1/param2*(x**(param2-1)-x**(-1-param2/2))
  • 你能发布数据[0]中的内容吗?

标签: python sympy


【解决方案1】:

1.解决方案: 您的问题是,函数 T 需要一个值,但您正在分发一个列表。试试这个而不是print T(data[0],[0.29,4.5])来获取结果列表:

print [T(val,[0.29,4.5]) for val in data[0]]

或者使用包装函数:

def arrayT(array, params):
    return [T(val, params) for val in array]

print arrayT(data[0], [0.29, 4.5])

2。解决方案: 你必须改变你的数学表达式。不知何故 sympy 不适用于列表列表,所以试试这个:

expr = "2*y/z*(x**(z-1)-x**(-1-z/2))"
T=lambdify((x,y,z),expr,'numpy')

print T(data[0], 0.29, 4.5)

【讨论】:

  • 我已经尝试过了,它也可以,但问题是我每次都用不同的数组在别处评估 T,因此需要一个能够接收数组和给出数组的数学表达式。跨度>
  • 为什么数学函数需要能够接收数组。你不能只定义一个包装函数吗?
  • 第二个解决方案不起作用,仍然出现相同的错误。使用双方括号
  • 第一个解决方案不是一个可行的选择,因为我有一个输出表达式的函数。还有其他表达式,我已经编码了。我目前正在研究一个用户可以给出自己的数学模型(表达式)的案例。我必须使用用户选择的特定模型(表达式),所以我需要让表达式与数组一起使用。
  • 我想我明白了。我更新了第二个解决方案。它适用于我的机器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
  • 1970-01-01
相关资源
最近更新 更多