Python Numpy计算没有循环

时间:2017-03-22 11:19:27

标签: 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,inner或smth)。我会很感激任何提示=)

1 个答案:

答案 0 :(得分:1)

这是一种矢量化方法,利用效率matrix-multiplicationnp.dot -

n = y.shape[0]
exp_val = (1 - 1 / (1 + np.exp(-np.dot(X,w)*y)))
out = -(y*exp_val).dot(X)/n

我们基本上分两部分来解决/矢量化:

1)通过执行np.dot(X[i],w) * y[i]向量化np.dot(X,w),从而一次性执行所有这些迭代点积。

2)使用mean模拟y[i] * X[i] * exponential_part的{​​{1}},其执行总和减少,然后除以减少轴上的元素数。

运行时测试和验证

方法 -

dot-product

计时 -

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