我不能保证效率,但你可以在函数定义模板字符串中使用给定的字符串表达式s
,通过exec
将其执行到本地字典中,对于非ufunc表达式进行向量化,然后在建议的my_eval
函数内调用它:
import numpy as np
def my_eval(s, a, b):
locals_dict = {}
source = f"def f(a, b): return {s}"
exec(source, globals(), locals_dict)
f = np.vectorize(locals_dict["f"])
return f(a, b)
s = "1.5 * b if 2 * a > 7 else a + b"
a = np.array([1, 4]).astype(float)
b = np.array([3, 1]).astype(float)
c = my_eval(s, a, b)
print(c)
这可以被修改以处理可变数量的输入参数。例如,类似以下内容的东西可以处理多达26个不同的输入数组,每个字母一个:
import numpy as np
from string import ascii_lowercase
def my_eval(s, *args):
locals_dict = {}
params = ", ".join(list(ascii_lowercase[0:len(args)]))
source = f"def f(*args): {params} = args; return {s}"
exec(source, globals(), locals_dict)
f = np.vectorize(locals_dict["f"])
return f(*args)
numpy
版本已经不支持python2.x
超过 3 年了。使用python2
的用户数量很少,无法进行测试。np.fromiter((eval(s) for a, b in zip(a1, b1)), dtype=float)
可以与重命名的数组(python3
)一起使用。字符串中的代码不能与np.arrays
一起使用。我认为没有简单的方法可以避免解析字符串。 - Michael Szczesnynumpy
问题的4.3%?有趣))。 - Michael Szczesny