我有一个Python函数f,它接受一对数字并返回计算结果,比如^(?<p>(?:[^()\[\]{}]++|\((?&p)\)|\[(?&p)\]|\{(?&p)\})*)$
x+y
如何对def f(x,y):
return x+y
进行矢量化,因此对于给定的矢量X =(x1,...,xn)和Y =(y1,...,yn)
f_vectorized(X,Y)返回f(x1,y1),f(x2,y2)......的数组?
编辑
上面,x + y是一个例子,但实际计算更复杂,因此通过考虑x和y,numpy向量不一定是开箱即用的。
答案 0 :(得分: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 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
并列出@ youglaria建议的列表理解或map
解决方案
答案 1 :(得分: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)]