【问题标题】:multiplication of 3-dimensional matrix in numpynumpy中3维矩阵的乘法
【发布时间】:2013-03-20 22:22:54
【问题描述】:

我想我昨天问了wrong question。我真正想要的是乘以两个2x2xN 矩阵AB,这样

C[:,:,i] = dot(A[:,:,i], B[:,:,i])

例如,如果我有一个矩阵

A = np.arange(12).reshape(2, 2, 3)

如何获得具有上述定义的C = A x A?有没有内置函数可以做到这一点?


另外,如果我将A (shape 2x2xN)B (shape 2x2x1, instead of N) 相乘,我想得到

C[:,:,i] = dot(A[:,:,i], B[:,:,1])

【问题讨论】:

    标签: python matrix numpy matrix-multiplication


    【解决方案1】:

    尝试使用numpy.einsum,它有一点学习曲线,但它应该可以满足您的需求。这是一个帮助您入门的示例。

    import numpy as np
    
    A = np.random.random((2, 2, 3))
    B = np.random.random((2, 2, 3))
    
    C1 = np.empty((2, 2, 3))
    for i in range(3):
        C1[:, :, i] = np.dot(A[:, :, i], B[:, :, i])
    
    C2 = np.einsum('ijn,jkn->ikn', A, B)
    np.allclose(C1, C2)
    

    【讨论】:

    • 这太棒了。它适用于问题中的两种情况。当我交换 AB (在第二个问题中的形状不同)时,它甚至可以工作。
    • +1 第一次看到einsum用的,有"undistinguishable from magic"的味道,功能强大,速度超快。
    • @Bi Rico,@Jaime,好的,除了令人敬畏之外,有人可以解释一下'ijn,jkn->ikn' 的情况吗?我发现很难将 numpy 文档与这个特殊案例联系起来。
    • @LWZ 首先,您需要了解矩阵点积将写为('ij,jk->ik')(请参阅mathworld.wolfram.com/MatrixMultiplication.html)。然后,您希望对最后一维中的所有矩阵执行相同的操作,这就是在末尾添加 n 所做的事情。如果您将上面答案中的循环变量从i替换为n,也许它可以帮助您更清楚地看到它。
    • 当最后一个维度不同时它起作用的原因是因为 numpy 广播 scipy.org/EricsBroadcastingDoc 具有兼容形状的数组。这是最后一个维度为 3 和 4 时收到的错误消息:ValueError: operands could not be broadcast together with remapped shapes [original->remapped]: (2,2,3)->(2,newaxis,3,2) (2,2,4)->(2,4,2)
    猜你喜欢
    • 2020-11-25
    • 2019-04-07
    • 2017-02-10
    • 2014-06-27
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 2021-12-12
    相关资源
    最近更新 更多