gpt4 book ai didi

python - 如果表达式包含 sympy 对象,则 Lambdify 表达式在与数组一起使用时引发 TypeError

转载 作者:太空宇宙 更新时间:2023-11-04 05:17:33 24 4
gpt4 key购买 nike

我正在使用 sympy 创建一个表达式,然后用 sympy.init_printing() 显示为 latex .该表达式在被 lambdified 为名为 f 的函数后用于计算。

但是,当使用数组或 Series 对象作为 f 的参数时,如果 lambdified 表达式包含一个 sympy 对象(例如 sympy.sqrt())。如果我使用 **.5 而不是 sqrt 我不会得到任何错误(但它不会在 IPython 中显示根)。

问题:
如何在通过 sympy.lambdify() 创建的函数上使用数组或 Series


以下代码是该问题的(简化)演示:

import sympy
import numpy
sympy.init_printing()

x = sympy.symbols('x')

_f = lambda x: sympy.sqrt(x)
f = sympy.lambdify(x, _f(x), (sympy, numpy))

f(x)

这会产生一个漂亮的根:

enter image description here

然后,尝试使用

import pandas
df = pandas.DataFrame([1,2,3], columns=['a'])

f(df['a'])

我得到:

TypeError                                 Traceback (most recent call last)
/home/gold/venvs/venv_python3.5/lib/python3.5/site-packages/sympy/core/cache.py in wrapper(*args, **kwargs)
92 try:
---> 93 retval = cfunc(*args, **kwargs)
94 except TypeError:

/home/gold/venvs/venv_python3.5/lib/python3.5/site-packages/pandas/core/generic.py in __hash__(self)
830 raise TypeError('{0!r} objects are mutable, thus they cannot be'
--> 831 ' hashed'.format(self.__class__.__name__))
832

TypeError: 'Series' objects are mutable, thus they cannot be hashed

During handling of the above exception, another exception occurred:

SympifyError Traceback (most recent call last)
<ipython-input-25-d0ba59fbbc02> in <module>()
2 df = pandas.DataFrame([1,2,3], columns=['a'])
3
----> 4 f(df['a'])

/home/gold/venvs/venv_python3.5/lib/python3.5/site-packages/sympy/__init__.py in <lambda>(_Dummy_21)

/home/gold/venvs/venv_python3.5/lib/python3.5/site-packages/sympy/functions/elementary/miscellaneous.py in sqrt(arg)
113 """
114 # arg = sympify(arg) is handled by Pow
--> 115 return Pow(arg, S.Half)
116
117

/home/gold/venvs/venv_python3.5/lib/python3.5/site-packages/sympy/core/cache.py in wrapper(*args, **kwargs)
93 retval = cfunc(*args, **kwargs)
94 except TypeError:
---> 95 retval = func(*args, **kwargs)
96 return retval
97

/home/gold/venvs/venv_python3.5/lib/python3.5/site-packages/sympy/core/power.py in __new__(cls, b, e, evaluate)
168 from sympy.functions.elementary.exponential import exp_polar
169
--> 170 b = _sympify(b)
171 e = _sympify(e)
172 if evaluate:

/home/gold/venvs/venv_python3.5/lib/python3.5/site-packages/sympy/core/sympify.py in _sympify(a)
353
354 """
--> 355 return sympify(a, strict=True)
356
357

/home/gold/venvs/venv_python3.5/lib/python3.5/site-packages/sympy/core/sympify.py in sympify(a, locals, convert_xor, strict, rational, evaluate)
275
276 if strict:
--> 277 raise SympifyError(a)
278
279 if iterable(a):

SympifyError: SympifyError: 0 1
1 2
2 3
Name: a, dtype: int64

最佳答案

"numpy" ,这有效:

In [845]: df=pd.DataFrame([1,2,3], columns=['a'])
In [846]: arr=np.array([1,2,3])
In [847]: f = sympy.lambdify(x, sympy.sqrt(x),"numpy")

In [849]: f(arr)
Out[849]: array([ 1. , 1.41421356, 1.73205081])
In [850]: f(df)
Out[850]:
a
0 1.000000
1 1.414214
2 1.732051

但 sympy 替代品不会:

In [851]: f(x)
...
AttributeError: 'Symbol' object has no attribute 'sqrt'

我没研究过lambdify文档足以知道我是否可以在一个函数中同时工作。

f = sympy.lambdify(x, sympy.sqrt(x),modules=("sympy", "numpy"))

处理 sympy但不是 numpy参数。

好像没有指定modules应与 modules = ["math", "mpmath", "sympy", "numpy"] 相同.

带有运算符的表达式工作得很好,甚至可以组合符号和数组:

In [926]: f = sympy.lambdify((x,y), x+y, ("numpy","sympy"))
In [927]: f(x,y)
Out[927]: x + y
In [928]: f(arr,arr)
Out[928]: array([2, 4, 6])
In [929]: f(arr,x)
Out[929]: array([x + 1, x + 2, x + 3], dtype=object)

我可能还没有发现任何你还没有发现的东西。

关于python - 如果表达式包含 sympy 对象,则 Lambdify 表达式在与数组一起使用时引发 TypeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41315237/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com