我有一個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的矢量不一定工作外的框。
我有一個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的矢量不一定工作外的框。
如何使用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 and
zip
:
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
好建議,是不是應該地圖用於這個?
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)]
沒有看到實際的代碼,我們不能告訴你如何正確地向量化這個東西。使用列表解析或'np.vectorize'會犧牲NumPy的所有性能優勢,這可能會導致1000倍左右的放緩。除非你的代碼涉及循環,這些循環根本上需要執行多次,這取決於輸入,像這樣的東西應該是相當直接的矢量化。 – user2357112