【问题标题】:converting einsum notation to for loops将 einsum 表示法转换为 for 循环
【发布时间】:2023-03-06 15:06:01
【问题描述】:

我正在尝试将以下 einsum 表示法转换为 for 循环,因为我无法完全理解矩阵发生了什么,并且我自己无法使用循环来复制结果:

np.einsum('bijc,bijd->bcd', x, x)

感谢任何帮助。

【问题讨论】:

  • x 长什么样子?
  • x = np.random.rand(1, 100 ,100, 24) x.shape 将提供:(1, 100, 100, 24)

标签: python numpy tensorflow pytorch


【解决方案1】:

让我们调用x_1和x_2这两个输入:

np.einsum('bijc,bijd->bcd', x_1, x_2)

bijc,bijd->bcd 归结为ijc,ijd->cd,因为没有使用第一个维度。想象一下,一方面你有c 频道ixj,另一方面有d 频道ixj。我们正在寻找的结果是一个cxb 矩阵。将来自x_1(总共有c)的每个ixj 层组合到来自x_2(总共有d)的每个ixj 层,总共得到c*d 值,这就是我们正在寻找。它实际上是两个ixj 层之间所谓的Hadamard product 的总和。

由于c 是第一个,c 将在第一个暗淡(行)中,而d 将是列数。

这是一个想法:

b_s, i_s, j_s, c_s = x_1.shape
d_s = x_2.shape[3]
y = np.zeros((b_s, c_s, d_s))
for b in range(b_s):
  for i in range(i_s):
    for j in range(j_s):
      for c in range(c_s):
        for d in range(d_s):
          y[b, c, d] += x_1[b, i, j, c]*x_2[b, i, j, d]

这个post 可能会给你一个更好的主意

还可以尝试以下操作,看看在 i=2、j=2、c=1 和 d=1 的简单案例中会发生什么:

a = [[[1], [0]], [[0], [1]]]; b = [[[4], [1]], [[2], [2]]]
np.einsum('ijc,ijd->cd', a, b)

结果是一个大小为...1x1 的d*c 矩阵(因为c 和d 都等于1)。这里的结果是[6]

【讨论】:

    猜你喜欢
    • 2012-10-13
    • 2015-12-03
    • 2021-03-12
    • 2018-02-22
    • 2017-04-26
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多