【问题标题】:Matrix and Tensor Multiplication with Numpy使用 Numpy 进行矩阵和张量乘法
【发布时间】:2018-11-06 06:24:19
【问题描述】:

我正在尝试使用张量进行矩阵乘法,但我不确定如何使用 Numpy。我一直在尝试与np.tensordot() 合作,但我一直无法这样做

以更简单的方式,如果我们要进行矩阵乘法,并且我们有一个向量 v (Nx1) 和一个矩阵 S (NxN),我们可以进行运算

v^T S v => (1xN)(NxN)(Nx1) => 一个数字

v = np.ones((3,1))
S = np.ones((3,3))
y = v.T.dot(S).dot(v)
y.shape = (1) or ()

现在,我想做以下事情:

让矩阵 M (3x5) 和张量 Z (5x3x3) 让我可以拥有
M^T Z M
其中 (M^T Z) 产生一个 (5x3) 矩阵,而 M^T Z M 产生一个 (1x5) 向量

M = np.ones((3,5))
Z = np.ones((5,3,3))
Y = <?> M.T * Z * M <?>
Y.shape = (5,) or (1,5)

有谁知道如何在不使用 Tensorflow 的情况下使用 Numpy 做到这一点?

【问题讨论】:

  • 你看过np.einsum吗?
  • dot 的经验法则是 A 的最后一个暗色与 B 的第二个到最后一个暗色配对。为我们澄清一下,M(或 M.T) 的尺寸与ZM 中的哪一个。我可以猜到,但我认为你需要明确
  • 我玩了一点eigensum,得到了不同的结果,形状都是(1,5)(5,)。我认为您应该说出您的预期结果或使用循环提供参考实现。

标签: python numpy


【解决方案1】:

我认为这可以计算出你想要的:

import numpy as np

M = np.ones((3, 5))
Z = np.ones((5, 3, 3))
# Multiply (5, 1, 3) x (5, 3, 3) x (5, 3, 1)
result = (M.T[:, np.newaxis] @ Z @ M.T[:, :, np.newaxis]).squeeze()
print(result)

输出:

[9. 9. 9. 9. 9.]

为方便起见,我使用了@ 运算符,但如果您更喜欢它或使用较旧的 Python 版本,可以将其替换为 np.matmul

result = np.matmul(np.matmul(M.T[:, np.newaxis], Z), M.T[:, :, np.newaxis]).squeeze()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多