我有一个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