不带循环的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