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

外积与向量运算平坦化

  •  2
  • Jundiaius  · 技术社区  · 7 年前

    我正在用二维数组执行以下操作 m 以及一维阵列 v :

    result = np.array([np.outer(v, m_row).flatten() for m_row in m])
    

    不过,这比numpy纯向量操作慢得多,因为我使用的是列表理解和 np.array 最后。

    我能做这个吗 outer 矩阵中每行只有一个运算的乘积?或者至少只使用向量运算,而不使用循环或列表理解?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Jundiaius    7 年前

    扩展尺寸,然后使用 broadcasting -

    (m[:, None, :]*v[:, None]).reshape(m.shape[0], -1)
    

    或者,与 np.einsum -

    np.einsum('ij,k->ikj', m, v).reshape(m.shape[0], -1)
    

    为了 m 形状 (30, 5) v 形状 (6,) :

    %timeit (m[:, None, :]*v[:, None]).reshape(m.shape[0], -1)
    # 5.93 µs ± 77.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    
    %timeit np.einsum('ij,k->ikj', m, v).reshape(m.shape[0], -1)
    # 5.44 µs ± 61.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    
    %timeit np.array([np.outer(v, m_row).flatten() for m_row in m])
    # 179 µs ± 18.9 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)