Numpy 2-D 和 3-D 矩阵 "row"-wise 乘法
Numpy 2-D & 3-D matrix "row"-wise multiplication
我开始学习 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 和相乘,但我可能完全偏离了轨道。
你可以使用np.einsum
-
np.einsum('ij,ijk->ik',array1,array2)
或在 Python 3.x
-
上使用 np.matmul
或 @
运算符
np.matmul(array1[:,None,:],array2)[:,0]
(array1[:,None,:] @ array2)[:,0]
我开始学习 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 和相乘,但我可能完全偏离了轨道。
你可以使用np.einsum
-
np.einsum('ij,ijk->ik',array1,array2)
或在 Python 3.x
-
np.matmul
或 @
运算符
np.matmul(array1[:,None,:],array2)[:,0]
(array1[:,None,:] @ array2)[:,0]