【问题标题】:Broadcasting matrix-vector dot product广播矩阵-向量点积
【发布时间】:2014-06-11 23:08:21
【问题描述】:

我在一个形状为(1222, 47, 47) 的 3 维数组中收集了一组矩阵,在一个形状为 (1222, 47) 的二维数组中收集了一组向量。

是否有一种广播方式可以将每个 [47x47] 矩阵与其对应的 [47] 向量相乘?有了一个完整的循环,这将是

numpy.vstack([A[n, :, :].dot(xb[n, :]) for n in range(A.shape[0])])

这对于 1222 个元素是可以的,但我以后可能会有更多。我试过dotmatrix_multiplyinnerinner1d 是否符合要求,与transpose 结合使用,但我不太明白。这个可以吗?

【问题讨论】:

    标签: python numpy matrix broadcast


    【解决方案1】:

    其中任何一个都应该这样做:

    matrix_multiply(matrices, vectors[..., None])
    np.einsum('ijk,ik->ij', matrices, vectors)
    

    不过,没有人会利用高度优化的库。

    将来某个时候,当PEP 465 已经实现时,使用 Python >= 3.5 你应该能够简单地做到:

    matrices @ vectors[..., None]
    

    【讨论】:

    • +1 以获得很好的答案,只是出于好奇,您怎么知道这两种解决方案都没有使用优化库?
    • 啊,我错过了我需要添加新轴。注意:添加新轴的通俗方式应该是np.nexaxis,它的值None不是只是一个临时的实现细节吗?
    • 我认为这不仅仅是一个实现细节。文档确实说None 可以用来代替newaxis,请参阅here,所以我认为这使它成为API 的一部分。
    • @CTZhu 我或多或少知道源代码,einsum 将使用 SIMD 操作,如果您的处理器支持它们,matrix_multiply 只是一个普通的 C 实现,即使它没有使用 BLAS可用。
    猜你喜欢
    • 2019-03-06
    • 2019-07-10
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多