在python中矢量化一个二维函数

时间:2016-01-11 21:03:31

标签: python vectorization

我有一个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向量不一定是开箱即用的。

2 个答案:

答案 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)]