不带循环的Python Numpy计算
所以我需要转换下面的行不带循环的Python Numpy计算,python,performance,numpy,vectorization,Python,Performance,Numpy,Vectorization,所以我需要转换下面的行 np.mean([-y[i] * X[i] * (1 - 1 / (1 + np.exp( - np.dot(X[i],w) * y[i]))) for i in range(X.shape[0])], axis = 0) 其中y.shape=(N,),X.shape=(N,M),w.shape=(M,) 输出的形状必须是(M,) 我不知道该使用哪个numpy函数(dot、internal或smth之类)。如果有任何提示,我将不胜感激。=)这里有一种矢量化方法,它利
np.mean([-y[i] * X[i] * (1 - 1 / (1 + np.exp( - np.dot(X[i],w) * y[i]))) for i in range(X.shape[0])], axis = 0)
其中y.shape=(N,)
,X.shape=(N,M)
,w.shape=(M,)
输出的形状必须是(M,)
我不知道该使用哪个numpy函数(dot、internal或smth之类)。如果有任何提示,我将不胜感激。=)这里有一种矢量化方法,它利用了高效的
矩阵乘法
-
我们基本上分两部分解决/矢量化它:
1) 矢量化:np.dot(X[i],w)*y[i]
通过执行np.dot(X,w)
,从而一次性执行所有迭代点积
2) 用点积模拟y[i]*X[i]*指数部分
的平均值
,该点积进行总和缩减,然后除以沿着缩减轴的元素数
运行时测试和验证
接近-
def original_app(y,X,w):
return [np.mean([-y[i] * X[i] * (1 - 1 / (1 + np.exp( - \
np.dot(X[i],w) * y[i]))) for i in range(X.shape[0])], axis = 0)]
def vectorized_app(y,X,w):
n = y.shape[0]
exp_val = (1 - 1 / (1 + np.exp(-np.dot(X,w)*y)))
out = -(y*exp_val).dot(X)/n
return out
时间安排-
In [117]: N,M = 300,400
...: y = np.random.rand(N)
...: X = np.random.rand(N,M)
...: w = np.random.rand(M)
...:
In [118]: out1 = original_app(y,X,w)
In [120]: out2 = vectorized_app(y,X,w)
In [121]: np.allclose(out1, out2)
Out[121]: True
In [122]: %timeit original_app(y,X,w)
1000 loops, best of 3: 1.29 ms per loop
In [123]: %timeit vectorized_app(y,X,w)
10000 loops, best of 3: 47.1 µs per loop
发布的解决方案对你有用吗?是的!这真的很有帮助,非常感谢
In [117]: N,M = 300,400
...: y = np.random.rand(N)
...: X = np.random.rand(N,M)
...: w = np.random.rand(M)
...:
In [118]: out1 = original_app(y,X,w)
In [120]: out2 = vectorized_app(y,X,w)
In [121]: np.allclose(out1, out2)
Out[121]: True
In [122]: %timeit original_app(y,X,w)
1000 loops, best of 3: 1.29 ms per loop
In [123]: %timeit vectorized_app(y,X,w)
10000 loops, best of 3: 47.1 µs per loop