代码之家  ›  专栏  ›  技术社区  ›  Denver Dang

使用Numpy代替循环

  •  2
  • Denver Dang  · 技术社区  · 6 年前

    import numpy as numpy
    
    
    x = np.linspace(1, 10, 10)
    y = np.linspace(1, 10, 10)
    x[::-1].sort()
    y[::-1].sort()
    tot_value = np.sum(y)
    
    n_values = np.array([1, 2, 3])
    
    final = np.sum((x[:, np.newaxis]**(1/n_values))*(y[:, np.newaxis]/tot_value))**n_values
    
    final2 = [np.sum((x[:, np.newaxis]**(1/i))*(y[:, np.newaxis]/tot_value))**i for i in n_values]
    

    我的问题是我想用Numpy( final )来模拟 final2 因为速度太快了。但是结果是不一样的,我尝试了不同的东西,但是我似乎不知道怎么做,如果可能的话?

    输出 最终的 是:

    [275.3622303   16.59404201  16.59404201]    
    

    最终2

    [6.7290539608469775, 7.0, 7.0]
    

    2 回复  |  直到 6 年前
        1
  •  2
  •   Divakar    6 年前

    只需将数组直接放入同一个表达式中并沿第一个轴求和即可-

    i = n_values
    out = np.sum((x[:, np.newaxis]**(1/i))*(y[:, np.newaxis]/tot_value),axis=0)**i
    

    einsum -

    out = np.einsum('ij,ij->j',x[:, np.newaxis]**(1/i),y[:, np.newaxis]/tot_value)**i
    

    还有更多 matrix-multiplication -

    out = (y/tot_value).dot(x[:, np.newaxis]**(1/i))**i
    
        2
  •  1
  •   Nils Werner    6 年前

    您可以使用广播:

    np.sum(
        (x[None, :] ** (1 / n_values[:, None])) * (y[None, :] / tot_value),
        axis=1
    ) ** n_values