【问题标题】:Numpy - Multiple Outer ProductsNumpy - 多个外部产品
【发布时间】:2018-08-21 13:27:37
【问题描述】:

我想知道是否有一种方法可以计算多个外部产品并将结果堆叠在一个操作中。

假设我有一个 Nx1 向量并用一个 1xM 向量取外积,结果将是一个 NxM 矩阵。

如果我有一个 NxR 矩阵 A 和一个 RxM 矩阵 B 会怎样。是否可以构造一个 NxMxR 矩阵,其中输出矩阵的每一层都是 A 的相应列和 B 的行的外积?

我知道在 R 上的单个 for 循环中执行此操作非常容易,但我想知道是否有更快的方法使用 numpy 内置函数(通常在涉及 numpy 时)。

我无法找出一组与 einsum 一起使用的索引(我什至不确定 einsum 是否是正确的方法,因为这里不涉及求和)

【问题讨论】:

    标签: python arrays numpy multidimensional-array


    【解决方案1】:

    是的,当然,使用broadcasting或Einsum(没有求和的事实并不重要)

    N, M, R = 8, 9, 16
    
    A = numpy.random.rand(N)
    B = numpy.random.rand(M)
    
    C = A[:, None] * B[None, :]
    D = numpy.einsum('a,b->ab', A, B)
    numpy.allclose(C, D)
    # True
    C.shape
    # (8, 9)
    
    A = numpy.random.rand(N, R)
    B = numpy.random.rand(M, R)
    
    C = A[:, None, :] * B[None, :, :]
    D = numpy.einsum('ar,br->abr', A, B)
    numpy.allclose(C, D)
    # True
    C.shape
    # (8, 9, 16)
    

    【讨论】:

    • 你能解释一下广播是如何工作的吗?它本质上是在重塑数组以添加一个空轴吗?
    • 是的,就是这样。我添加了一个指向 NumPy 文档关于广播的链接。
    • 啊,我明白了,我没有将这样的元素乘法广播与外部产品等价联系起来。谢谢!
    • 嗨 Nils,我正在尝试使用两个矩阵 A、B,它们都具有 R 行和 N 列。我想将每一行的外积与另一行的行形成,即 A_j 外 B_j for j=1,...,R。我来自数学背景,你的编码让我很难过。您能描述一下如何使用 einsum 来完成这项任务吗?
    • @jamesmartini 请创建一个新问题
    猜你喜欢
    • 1970-01-01
    • 2021-06-28
    • 2013-08-20
    • 2017-06-08
    • 2014-07-28
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多