代码之家  ›  专栏  ›  技术社区  ›  orange

矢量顺序numpy计算

  •  1
  • orange  · 技术社区  · 8 年前

    # data matrix
    d = np.random.rand(1496, 1, 2)
    
    # boolean matrix
    r = np.random.rand(5, 1496, 1, 2) > 0.5
    
    # result matrix
    x = np.empty((5,))
    
    # How can I avoid this loop?
    for i in xrange(r.shape[0]):
      x[i] = d[r[i]].sum()
    

    有没有可能通过某种方式将循环矢量化来加快速度?

    2 回复  |  直到 8 年前
        1
  •  2
  •   AGN Gazer    8 年前

    @Psidom方法的变体:

    np.tensordot(d, r, axes=((0,1,2), (1,2,3)))
    

    这取决于 tensordot documentation :

    给定两个张量(维数大于或等于1的数组), a b (a_axes, b_axes) 的和 b a_axes b_axes .

    从根本上讲 张索多 在两个阵列中 。与@Psidom的方法相比,它没有提供更好的性能。

    另外,请参见 Understanding tensordot

        2
  •  1
  •   akuiper    8 年前

    你可以这样矢量化它;自从 d 一维是否小于 r d 将播出 axis=0 属于 从而避免循环;从那以后 r 是布尔数组, d[r].sum() 将与相同 (d*r).sum :

    (d * r).sum(axis=(1,2,3))
    # array([ 775.17049697,  728.61537246,  735.05686655,  765.19469927,
    #         759.44834287])
    

    x :

    ((d*r).sum(axis=(1,2,3)) == x).all()
    # True