python - py-expression-eval - Passing a numpy ndarray

888 Views Asked by At

I am using py-expression-eval library for evaluating an expression.

import numpy as np
from py_expression_eval import Parser
parser=Parser()
a = np.array([1,2,3])
parser.parse('x*5').evaluate({'x':a})
#Works and outputs
array([  5.,  10.,  15.])

However:

parser.parse('sin(x)').evaluate({'x':a})

throws an error:

Traceback (most recent call last):
File "<pyshell#52>", line 1, in <module>
parser.parse('sin(x)').evaluate({'x':a})
File "C:\Python27\lib\site-packages\py_expression_eval\__init__.py", line 133, in evaluate
nstack.append(f(n1))
TypeError: only length-1 arrays can be converted to Python scalars

But if I pass values of array one by one it works:

parser.parse('sin(x)').evaluate({'x':a[0]})
0.8414709848078965
1

There are 1 best solutions below

3
On BEST ANSWER

Looks like sin is hardwired to math.sin. Replacing it with np.sin works:

parser.ops1['sin'] = np.sin
parser.parse('sin(x)').evaluate({'x':a})

array([ 0.84147098,  0.90929743,  0.14112001])

Operators are in ops2:

parser.ops2['^'] = np.power
parser.parse('x^2').evaluate({'x':a})

array([1, 2, 3])