【问题标题】:How to execute a matrix multiplication of to 3D arrays using numpy einsum function to obtain a product matrix of 2D?如何使用 numpy einsum 函数对 3D 数组执行矩阵乘法以获得 2D 乘积矩阵?
【发布时间】:2021-02-20 16:02:50
【问题描述】:

如何在不使用循环结构的情况下执行以下代码,而不是使用 numpy einsum 函数?我希望产品矩阵是 2D 矩阵而不是 3D。简单地做 "D = np.einsum('ijk,ijk->jk',A,B) D += np.einsum('ijk,ijk->jk',B,C) " 给出不同的结果。我应该引入任何中间临时数组或其他东西来使用 einsum 函数吗?

import numpy as np
A = np.array( [[[1, 2, 3, 0],
                 [ 4, 2, 1, 1]],
                   [[2, 0, 0, 3],
                     [1, 0, 2, 4]]] )

B = np.array( [[[0, 2, 3, 1],
                 [0, 2, 5, 0]],
                  [[0, 1, 2, 2],
                    [3, 3, 2, 1]]] )
C = np.array( [[[0, 2, 2, 1],
                 [0, 2, 1, 0]],
                  [[0, 0, 2, 0],
                    [3, 1, 2, 1]]] )
X = np.zeros([2,4])
for i in range(2):
  for j in range(2):
    for k in range(4):

        X[j,k] = A[i,j,k]*B[i,j,k]
        X[j,k] += B[i,j,k]*C[i,j,k]
D = np.einsum('ijk,ijk->jk',A,B)
D += np.einsum('ijk,ijk->jk',B,C)

        

【问题讨论】:

  • 什么是C?它不存在于问题中
  • 对不起,大卫,我忘了添加 C 数组。谢谢你通知我。我现在已经更新了代码。你能帮帮我吗?
  • 你的 i 循环没有用,因为你丢弃了所有的 i=0 值。
  • 看起来你正在尝试计算X = (A*B + B*C).sum(axis = 0)
  • 实际上需要 i 循环来指定 A、B 和 C 矩阵的索引

标签: python numpy numpy-einsum


【解决方案1】:

根据我的评论,只需 1 步即可替换 i 循环

In [64]:   X = np.zeros([2,4])
    ...:   i=1
    ...:   for j in range(2):
    ...:     for k in range(4):
    ...: 
    ...:         X[j,k] = A[i,j,k]*B[i,j,k]
    ...:         X[j,k] += B[i,j,k]*C[i,j,k]
In [65]: X
Out[65]: 
array([[ 0.,  0.,  4.,  6.],
       [12.,  3.,  8.,  5.]])

这是循环产生的值。您已经丢弃了 i=0 值。

但是你不需要循环来做:

In [68]: A[1,:,:]*B[1,:,:]+B[1,:,:]*C[1,:,:]
Out[68]: 
array([[ 0,  0,  4,  6],
       [12,  3,  8,  5]])

In [69]: A*B+B*C
Out[69]: 
array([[[ 0,  8, 15,  1],
        [ 0,  8, 10,  0]],

       [[ 0,  0,  4,  6],
        [12,  3,  8,  5]]])

einsum 也一样:

In [71]: np.einsum('ijk,ijk->ijk',A,B)+np.einsum('ijk,ijk->ijk',B,C)
Out[71]: 
array([[[ 0,  8, 15,  1],
        [ 0,  8, 10,  0]],

       [[ 0,  0,  4,  6],
        [12,  3,  8,  5]]])

如果你想对i求和:

In [72]: np.einsum('ijk,ijk->jk',A,B)+np.einsum('ijk,ijk->jk',B,C)
Out[72]: 
array([[ 0,  8, 19,  7],
       [12, 11, 18,  5]])
In [73]: (A*B+B*C).sum(axis=0)
Out[73]: 
array([[ 0,  8, 19,  7],
       [12, 11, 18,  5]])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    相关资源
    最近更新 更多