zel*_*ell 0 python vectorization
我有一个Python函数f,它接受一对数字并返回计算结果,比方说, x+y
def f(x,y):
return x+y
Run Code Online (Sandbox Code Playgroud)
如何进行矢量化f,因此对于给定的矢量X =(x1,...,xn)和Y =(y1,...,yn)
f_vectorized(X,Y)返回f(x1,y1),f(x2,y2)...的数组?
编辑
上面,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])
Run Code Online (Sandbox Code Playgroud)
编辑
对于更复杂的功能,您可以使用list comprehension and zip:
In [451]: [f(*par) for par in zip(a, b)]
Out[451]: [1, 3, 5, 7]
Run Code Online (Sandbox Code Playgroud)
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])
Run Code Online (Sandbox Code Playgroud)
性能:
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
Run Code Online (Sandbox Code Playgroud)
因此,如果您对性能感兴趣,您应该使用zip并列出map@tglaria建议的理解或解决方案