2015-08-28 59 views
1

我想知道是否有内置的numpy(即高效)方法将函数向量应用于值向量,以便每个函数都有相应的值(几乎就像函数的输入值的点积)。伪代码示例:将不同的Python函数应用于相应的元素

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

在此先感谢!

编辑:

有沿着类似的路线,因为这彼此的问题,但是这一个专门询问是否有不只是遍历列表更有效的方式,而另一个问题是更侧重于优雅的代码本身。

+1

您是否检查过http://stackoverflow.com/questions/4231345/zip-and-apply-a-list-of-functions-over-a-list-of-values-in-python?虽然答案不是以不平衡的方式。 – yangjie

+0

谢谢,检查出来。你知道这是多高效吗?另请参阅我的评论以下由radeklos的答案 –

+0

我认为你想结束一个numpy数组? –

回答

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 

我不知道如何更快的for循环就是要诚实,Python解释器可能不花哨的优化。

+1

为什么不使用枚举?另外,如果你想要时间Python代码使用timeit –

+0

@PadraicCunningham timeit看起来不错,没听说过!枚举可能是一种更* pythonic *的方式,是的 – mikeecb

+0

如果你有ipython,它就像'timeit your_func'一样简单https://ipython.org/ipython-doc/dev/interactive/magics.html#magic -timeit –

0

您可以使用zip函数合并两个列表,然后将函数项调用到值项。

zip([f1, f1], [v1, v2]) -> ((f1, v1), (f2, v2)) 
+0

这将是多高效?为了提高效率,我最近开始使用numpy,但是我正在考虑为此写一个C函数,然后从Python中调用它 –

+0

或者更好的Python 2中的'izip' – warvariuc

相关问题