代码之家  ›  专栏  ›  技术社区  ›  cs95 abhishek58g

计算列之间加权乘积之和的最快方法是什么?

  •  1
  • cs95 abhishek58g  · 技术社区  · 8 年前
    np.random.seed([3, 14])
    df = pd.DataFrame(np.random.randn(5, 3), columns=list('ABC'))
    df
    
              A         B         C
    0 -0.602923 -0.402655  0.302329
    1 -0.524349  0.543843  0.013135
    2 -0.326498  1.385076 -0.132454
    3 -0.407863  1.302895 -0.604236
    4 -0.243362 -0.211261 -2.056621
    

    df.A * 1 + df.B * 2 + df.C * 3 ?

    本质上,我想,对于这个数据帧:

    0   -0.501247
    1    0.602741
    2    2.046290
    3    0.385219
    4   -6.835748
    

    答案 df。A*1+df。B*2+df。C*3 df.iloc[:, 0] * 1 + df.iloc[:, 1] * 2, .... 以某种方式

    我对任何 numba

    2 回复  |  直到 8 年前
        1
  •  2
  •   jezrael    8 年前

    我尝试改进解决方案-删除重塑和更改 arrange :

    a = df.dot(np.arange(1, len(df.columns)+1))
    print (a)
    0   -0.501247
    1    0.602741
    2    2.046290
    3    0.385219
    4   -6.835748
    dtype: float64
    

    numpy :

    a = pd.Series(np.dot(df.values, np.arange(1, len(df.columns)+1)), index=df.index)
    print (a)
    0   -0.501247
    1    0.602741
    2    2.046290
    3    0.385219
    4   -6.835748
    dtype: float64
    
        2
  •  1
  •   cs95 abhishek58g    8 年前

    选项1

    据我所知,最快的是使用 df.dot

    df.dot((np.arange(df.shape[1]) + 1).reshape(-1, 1))
    
              0
    0 -0.501247
    1  0.602741
    2  2.046290
    3  0.385219
    4 -6.835748
    

    选项2

    元素级产品和 sum

    (df * (np.arange(df.shape[1]) + 1)).sum(1)
    
    0   -0.501246
    1    0.602742
    2    2.046292
    3    0.385219
    4   -6.835747
    

    表演

    小型( 5 x 3 )

    10000 loops, best of 3: 131 µs per loop  # dot
    1000 loops, best of 3: 531 µs per loop   # element-wise prod + sum
    

    大型( 100000 x 1000 )

    10 loops, best of 3: 36.4 ms per loop   # dot
    1 loop, best of 3: 1.18 s per loop      # element-wise prod + sum
    

    有关实施背后的魔力的信息 pandas / numpy dot Why is matrix multiplication faster with numpy than with ctypes in Python? .