将不同的Python函数应用于相应的元素

时间:2015-08-28 10:47:39

标签: python numpy vectorization

我想知道是否有一种内置的numpy(即高效)方法将函数向量应用于值向量,这样每个函数都会获取相应的值(几乎就像一个点积输入值到函数)。伪代码中的一个例子:

[func1, func2, func3, ..., funcn] x [val1, val2, val3, ..., valn] 
= [func1(val1), func2(val2), func3(val3), ..., funcn(valn)].

提前致谢!

编辑:

还有另外一个与此问题相似的问题,但是这个问题专门询问是否有一种比仅仅迭代列表更有效的方法,而另一个问题更侧重于代码本身的优雅。

2 个答案:

答案 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))