【问题标题】:Numpy 2-D & 3-D matrix "row"-wise multiplicationNumpy 2-D & 3-D 矩阵“行”乘法
【发布时间】:2019-09-27 22:38:42
【问题描述】:

我开始学习 numpy,我正在尝试在 2 维和 3 维矩阵之间进行一种奇怪的矩阵乘法。我有一个功能可以满足我的需求,但我很好奇是否有更好的方法。

假设我们有一个具有 (KxN) 维的矩阵 M1,以及另一个具有 (KxNxN) 维的矩阵 M2。我正在尝试将 M1 的每 (1xN) 行与 M2 的相应 (NxN) 矩阵相乘。这是我的示例矩阵代码:

a = [[1., 2., 3.],
     [0., 9., 8.]]
a = np.array(a)
b = [[[.5, .5, .5],
      [.5, .5, .5],
      [.5, .5, .5]],
     [[.25, .25, .25],
      [.25, .25, .25],
      [.25, .25, .25]]]
b = np.array(b)

c = [[5., 5., 5., 5., 5.]]
c = np.array(c)
d = [[[.1, .1, .1, .1, .1],
      [.2, .2, .2, .2, .2],
      [.3, .3, .3, .3, .3],
      [.4, .4, .4, .4, .4],
      [.5, .5, .5, .5, .5]]]
d = np.array(d)


def mul(x, y):
    result = []
    for i in range(len(x)):
        result.append(x[i] @ y[i])
    return np.array(result)


print(mul(a, b))
[[3.   3.   3.  ]
 [4.25 4.25 4.25]]
print(mul(c, d))
[[7.5 7.5 7.5 7.5 7.5]]

我认为这很清楚。我确信有更好的方法可以做到这一点,但到目前为止我无法想出一个。我一直在尝试 apply_along_axis 和 multiply,但我可能完全偏离了轨道。

【问题讨论】:

    标签: python python-3.x numpy numpy-ndarray


    【解决方案1】:

    你可以使用np.einsum -

    np.einsum('ij,ijk->ik',array1,array2)
    

    或者在Python 3.x 上使用np.matmul@ 运算符-

    np.matmul(array1[:,None,:],array2)[:,0]
    (array1[:,None,:] @ array2)[:,0]
    

    【讨论】:

    • 看起来很完美!非常感谢,我不太确定这个功能是如何工作的
    猜你喜欢
    • 2019-04-07
    • 2018-07-18
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 2018-06-19
    相关资源
    最近更新 更多