我想知道是否有一种内置的numpy(即高效)方法将函数向量应用于值向量,这样每个函数都会获取相应的值(几乎就像一个点积输入值到函数)。伪代码中的一个例子:
[func1, func2, func3, ..., funcn] x [val1, val2, val3, ..., valn]
= [func1(val1), func2(val2), func3(val3), ..., funcn(valn)].
提前致谢!
编辑:
还有另外一个与此问题相似的问题,但是这个问题专门询问是否有一种比仅仅迭代列表更有效的方法,而另一个问题更侧重于代码本身的优雅。
答案 0 :(得分:1)
你可以这样做:
results = map((lambda (f, v): f(v)), zip(functions, values))
但是压缩然后映射不仅仅是迭代两个列表的索引并将函数应用于值:
results = []
for i in range(len(functions)):
results.append(functions[i](values[i]))
<强>测试强>
zipmap.py
def add1(x):
return x + 1
vs = range(100000)
fs = [add1] * 100000
results = map((lambda (f, v): f(v)), zip(fs, vs))
> time python zipmap.py
>
> real 0m0.153s
> user 0m0.127s
> sys 0m0.023s
forloop.py
def add1(x):
return x + 1
vs = range(100000)
fs = [add1] * 100000
results = []
for i in range(len(fs)):
results.append(fs[i](vs[i]))
> time python forloop.py
>
> real 0m0.155s
> user 0m0.073s
> sys 0m0.030s
我不知道循环是多么快,说实话,python解释器可能做了花哨的优化。
答案 1 :(得分:0)
您可以使用zip函数合并两个列表,然后将函数项调用为值项。
zip([f1, f1], [v1, v2]) -> ((f1, v1), (f2, v2))