很抱歉提出一个非常基本的问题。 假设我已经定义了一个函数f,其域是p-dim向量,并且我有一个p-dim向量说A的列表。如何向量化我的计算以获得f(A [0]),f(A [1] ),...,f(A [len(A)])? 例如:
import numpy as np
def f(x):
return sum([x[i]*np.sin(x[i]) for i in range(len(x))])
A=[[i,i+1,i+2] for i in range(1000) ]
X=[f(A[i]) for i in range(len(A))]
如何对上述计算进行矢量化处理,以便更快地获得X?
答案 0 :(得分:1)
我不确定您是否还要向量化列表A
的生成。如果您担心函数f(X)
,则可能要使用Numpy的逐元素multiply
方法。下面是带有基准测试的示例。
import timeit
import numpy as np
def f(x):
return sum([x[i]*np.sin(x[i]) for i in range(len(x))])
def f2(X):
return np.multiply(X, np.sin(X))
start = timeit.default_timer()
A=[[i,i+1,i+2] for i in range(10000) ]
X=[f(A[i]) for i in range(len(A))]
stop = timeit.default_timer()
print(stop - start)
start = timeit.default_timer()
A=[[i,i+1,i+2] for i in range(1000) ]
X=[f2(A[i]) for i in range(len(A))]
stop = timeit.default_timer()
print(stop - start)
输出为:
0.16681260999631756
0.017789075556770784
表示f2
快10倍。
答案 1 :(得分:0)
为了对其进行矢量化处理,必须修改函数f
,使其在整个数组A
上起作用。在您的示例中,您希望数组中所有行的x * sin(x)之和。
乘法和sin
函数是逐元素工作的,因此不需要更改。但是您必须向np.sum
指定要对各行求和;这是通过设置“ axis = -1”来完成的。
def f_vec(x):
return np.sum(x*np.sin(x), axis=-1)
您可以将整个数组A
传递给此函数,并像以前一样获得X
:
In [39]: X_vec = f_vec(A)
In [40]: np.all(X_vec == X)
Out[40]: True