2016-01-11 130 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)]