2016-01-11 73 views
0

我有一个Python函数f,这需要一对数字和返回他们的计算结果,比如说,x+y矢量化Python中的2维函数

def f(x,y): 
      return x+y 

我怎么能向量化f,所以对于给定的向量x =(x1,...,xn)和Y =(y1,...,yn),f_vectorized(X,Y)返回f(x1,y1)的数组,f ,Y2)......?

EDIT

以上,x + y为一个例子,但实际计算比较复杂,所以通过把x和y如numpy的矢量不一定工作外的框。

+0

没有看到实际的代码,我们不能告诉你如何正确地向量化这个东西。使用列表解析或'np.vectorize'会牺牲NumPy的所有性能优势,这可能会导致1000倍左右的放缓。除非你的代码涉及循环,这些循环根本上需要执行多次,这取决于输入,像这样的东西应该是相当直接的矢量化。 – user2357112

回答

5

如何使用numpy作为输入?

import numpy as np 

def f(x,y): 
    return x+y 

a = np.array([0,1,2,3]) 
b = np.array([1,2,3,4]) 

In [430]: f(a,b) 
Out[430]: array([1, 3, 5, 7]) 

编辑

对于更复杂的功能,你可以使用list comprehension andzip

In [451]: [f(*par) for par in zip(a, b)] 
Out[451]: [1, 3, 5, 7] 

EDIT2

或者当你在留言中提到您可以使用np.vectorize

f_vec = np.vectorize(f) 

In [470]: f_vec([0, 1, 2, 3], [1, 2, 3, 4]) 
Out[470]: array([1, 3, 5, 7]) 

性能比较

In [471]: %timeit f_vec([0, 1, 2, 3], [1, 2, 3, 4]) 
10000 loops, best of 3: 38.3 µs per loop 

In [472]: %timeit [f(*par) for par in zip([0, 1, 2, 3], [1, 2, 3, 4])] 
1000000 loops, best of 3: 1.8 µs per loop 

In [476]: %timeit list(map(f, [0, 1, 2, 3], [1, 2, 3, 4])) 
1000000 loops, best of 3: 1.51 µs per loop 

所以,如果你有兴趣的表现,你应该使用zip和列表理解或map溶液@tglaria

+0

哦,对不起,我只是以x + y为例。 f中的实际计算更复杂,因此您的工作可能无法正常工作。但你提供了一些好点。谢谢。 – zell

+0

我只是意识到还有另一种选择:使用numpy.vectorize作为函数的注释。 – zell

+0

当map(...)'已经返回一个列表时,为什么使用'list(map(...))'? – tglaria

2

好建议,是不是应该地图用于这个?

def f(x,y): 
    return (x,y, x+y) 

print map(f,[0,1,2], [-1,0,-2]) 
>[(0, -1, -1), (1, 0, 1), (2, -2, 0)]