使用给定函数f进行向量化,该函数f取向量

时间:2018-07-18 04:54:21

标签: python numpy

很抱歉提出一个非常基本的问题。 假设我已经定义了一个函数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?

2 个答案:

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