2016-12-24 25 views
1

sympyを使用して式を作成し、sympy.init_printing()というラテックスとして表示しています。この式は、fという名前の関数にlambdifiedされた後の計算で使用されます。式にsympyオブジェクトが含まれている場合、Lambdifyの式は配列とともに使用するとTypeErrorを発生させます。

しかし、配列Seriesのオブジェクトをfの引数として使用する場合、暗黙の式にsympyオブジェクト(たとえばsympy.sqrt())が含まれていると、TypeErrorが発生します。 sqrtの代わりに**.5を使用した場合、エラーは表示されません(ただし、IPythonではルートが表示されません)。

質問:
がどのように私はsympy.lambdify()を通じて作成した関数に配列やSeriesを使用することができますか?

を使用しようとし、その後

enter image description here

:これはかなりのルートになり

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) 


次のコードでは、(単純化)問題のデモです

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

f(df['a']) 

私が手:"numpy"

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 
+0

'df ['a']。values'は' df'から派生したnumpy配列です。 'sympy'がそれを処理できるより良いチャンスがあります。 – hpaulj

+0

@hpauljまだエラーが発生しています: 'TypeError:unhashable type: 'numpy.ndarray'' –

+0

次に、' sympy'ドキュメントを掘り下げる必要があります。 – hpaulj

答えて

1

を、この作品:

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引数を処理します。

modulesmodules = ["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) 

事業者との表現であっても、シンボルと配列を組み合わせ、うまく動作します。

関連する問題