【问题标题】:Multiply a 3D matrix with a 2D matrix, return a matrix with the same dimensions as the 2D one将 3D 矩阵与 2D 矩阵相乘,返回与 2D 矩阵具有相同维度的矩阵
【发布时间】:2021-05-25 20:01:38
【问题描述】:

在 Numpy 中,假设我有一个维度为 i x j x k 的矩阵 A,以及一个维度为 k x i 的矩阵 B。如何在不使用循环的情况下取回尺寸为 k x i 的产品?
例如:

 Let         A = [[[1 2],
                   [3 4]],
                  [[5 6],
                   [7 8]]]

             B = [[a b],
                  [c d]]

我想得到:

             C = [[a+2c  5b+6d],
                  [3a+4c 7b+8d]]

我目前的解决方案是

np.diagonal(np.dot(A, B), axis1=0, axis2=2)

但是,问题是我正在处理一个大型数据集(AB 具有巨大的维度)所以np.dot(A, B) 会导致MemoryError。因此,我想找出一种更好的方法来解决这个问题,而无需计算点积。

我已经研究过 einsumtensordot 这样的函数,但我没有找到我需要的东西(或者我可能错过了一些东西)。如果有人可以帮助我,我将不胜感激。谢谢!

【问题讨论】:

  • 显示你的尝试
  • J 必须出现在输出形状中。请展示一个不是 2x2 的示例以了解原因。
  • np.diagonal(np.dot(A, B), axis1=0, axis2=2) 似乎没有给出预期的输出。检查B= [[1,2],[3,4]],预期输出为[[5,39],[11,53]]

标签: python numpy matrix vectorization


【解决方案1】:

您可以通过分析输入和输出维度来做到这一点。

A.shape -> i, j, k
B.shape -> k, i

你的例子不是很好,但是如果你仔细看看你要求的输出是什么,B 的形状必须与A 的第一个和最后一个维度匹配。

总和减少发生在A 的最后一个轴和B 的第一个轴上:

np.einsum('ijk,ki->ji', A, B)

einsum 可能令人生畏,但进行此类分析可以为您省去很多因反复试验而导致的挫败感。

【讨论】:

    【解决方案2】:

    看看你的输出,C[:,0]

    A[0] @ B[0].T
    

    同样,C[:,1]A[1] @ B[1].T

    考虑到这一点,np.einsum 公式为:

    C = np.einsum('ijk,ik->ji', A,B)
    

    【讨论】:

    • 比你快 30 秒 :)
    • @MadPhysicist 哈哈,但你的公式不同:-)。我讨厌这样的例子。
    • 你确定Bik 而不是ki
    • 我知道,对。并且没有来自OP的尝试。我总是很想关闭,因为不清楚的副手。
    • 噗。打败我:(np.einsum('ijk,ki->ji',A,B)
    猜你喜欢
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 2018-07-09
    • 2012-01-31
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    相关资源
    最近更新 更多