Python 三维矩阵的numpy点是如何工作的
numpy.dot如何用于三维阵列 我有:Python 三维矩阵的numpy点是如何工作的,python,python-3.x,numpy,Python,Python 3.x,Numpy,numpy.dot如何用于三维阵列 我有: 形状为[15,30,500]的A B带形状[15] 之后: C = np.dot(a.T, B) 我收到了带有[500,30]形状的C,但不明白如何(我想在没有numpy的情况下将代码移植到其他语言) 谢谢。由于这似乎是其他人编写的代码,并且您希望了解此案例的作用(特别是,而不是一般意义上的),出于移植的目的,我将使用一个简单的演示: In [46]: A = np.arange(24).reshape(2,3,4); B = np.array(
- 形状为[15,30,500]的A
- B带形状[15]
C = np.dot(a.T, B)
我收到了带有[500,30]形状的C,但不明白如何(我想在没有numpy的情况下将代码移植到其他语言)
谢谢。由于这似乎是其他人编写的代码,并且您希望了解此案例的作用(特别是,而不是一般意义上的),出于移植的目的,我将使用一个简单的演示:
In [46]: A = np.arange(24).reshape(2,3,4); B = np.array([10,20])
In [47]: A
Out[47]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
In [48]: A.T
Out[48]:
array([[[ 0, 12],
[ 4, 16],
[ 8, 20]],
[[ 1, 13],
[ 5, 17],
[ 9, 21]],
[[ 2, 14],
[ 6, 18],
[10, 22]],
[[ 3, 15],
[ 7, 19],
[11, 23]]])
点
:
In [50]: C = np.dot(A.T, B)
In [51]: C
Out[51]:
array([[240, 360, 480],
[270, 390, 510],
[300, 420, 540],
[330, 450, 570]])
同样的事情,但使用广播、元素乘法和求和:
In [52]: (A.T * B[None,None,:]).sum(axis=2)
Out[52]:
array([[240, 360, 480],
[270, 390, 510],
[300, 420, 540],
[330, 450, 570]])
或者使用索引符号einsum
:
In [53]: np.einsum('ijk,i->kj',A,B)
Out[53]:
array([[240, 360, 480],
[270, 390, 510],
[300, 420, 540],
[330, 450, 570]])
元素乘法的中间步骤:
In [54]: (A.T * B[None,None,:])
Out[54]:
array([[[ 0, 240],
[ 40, 320],
[ 80, 400]],
[[ 10, 260],
[ 50, 340],
[ 90, 420]],
[[ 20, 280],
[ 60, 360],
[100, 440]],
[[ 30, 300],
[ 70, 380],
[110, 460]]])
所以它是用
B
对a.T
(最后一个维度)的每一行做点积(标量积)。所以前两个维度有一个值(这里是(4,3))。这太棒了!非常感谢你。