Python Numpy 计算不循环

标签 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 函数(点、内部或类似的函数)。我将不胜感激任何提示=)

最佳答案

这是一种向量化方法,利用 np.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) 使用点积模拟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

关于Python Numpy 计算不循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42950161/

相关文章:

python - 连接连续相等元组中的字符串

android - 界面性能问题

java - 使用自己的 HashSet.add() 实现

java - 何时创建局部变量以及何时调用对象方法?

我的 Mac 上的 Python 很乱,帮我卸载我不需要的东西

python - 从字符串中保存和检索 Numpy 数组

python - 为什么我的 NumPy 日志空间给我一个无穷大数组?

Python github 使用用户名和密码 pull

python - 如何删除绘图上的单个刻度标签,保留刻度本身

python - Daphne + Channel v3 部署,运行时错误 : no running event loop