我有一个Python函数f,它接受一对数字并返回计算结果,比方说, x+y
def f(x,y): return x+y
如何进行矢量化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])
编辑
对于更复杂的功能,您可以使用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建议的理解或解决方案