你好,有人能帮我弄清楚如何使用np.einsum来产生下面的代码结果吗?我有一个(3、3、3)Tensor,我想得到这个结果,这是我用两个for循环得到的。我写的代码是为了产生这个输出。我试图用np.einsum来产生这个相同的结果,这是用下面的代码中的两个for循环得到的。我不熟悉使用np。理想情况下,我还想对结果行求和,得到9个值。第一个
yduiuuwa1#
我花了点时间才弄明白你在做什么,因为z在range(3)上迭代,所以aal依次是a[:,0,0]、a[:,0,1]、a[:,0,2]。或者一次完成:
z
range(3)
aal
a[:,0,0]
a[:,0,1]
a[:,0,2]
In [178]: aaL = a[:,0,:]; aaL Out[178]: array([[1, 2, 1], [1, 2, 1], [1, 2, 1]])
aam也做同样的迭代,所以用matmul/@/dot计算它们的乘积之和为:
aam
matmul/@/dot
In [179]: aaL.T@aaL Out[179]: array([[ 3, 6, 3], [ 6, 12, 6], [ 3, 6, 3]])
或者在einsum中:
einsum
In [180]: np.einsum('ji,jk->ik',aaL,aaL) Out[180]: array([[ 3, 6, 3], [ 6, 12, 6], [ 3, 6, 3]])
您的索引数组:
In [183]: bb Out[183]: [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2) In [185]: np.array(bb)[:3,:] Out[185]: array([[0, 0], [0, 1], [0, 2]])
如果我把它推广到bb的其余范围:
bb
In [192]: for i in range(3): ...: aaL = a[:,i] ...: print(aaL.T@aaL) ...: [[ 3 6 3] [ 6 12 6] [ 3 6 3]] [[27 36 18] [36 48 24] [18 24 12]] [[ 75 90 45] [ 90 108 54] [ 45 54 27]]
向einsum添加尺寸:
In [195]: np.einsum('jmi,jmk->mik', a,a) Out[195]: array([[[ 3, 6, 3], [ 6, 12, 6], [ 3, 6, 3]], [[ 27, 36, 18], [ 36, 48, 24], [ 18, 24, 12]], [[ 75, 90, 45], [ 90, 108, 54], [ 45, 54, 27]]])
1条答案
按热度按时间yduiuuwa1#
我花了点时间才弄明白你在做什么,
因为
z
在range(3)
上迭代,所以aal
依次是a[:,0,0]
、a[:,0,1]
、a[:,0,2]
。或者一次完成:
aam
也做同样的迭代,所以用matmul/@/dot
计算它们的乘积之和为:或者在
einsum
中:您的索引数组:
如果我把它推广到
bb
的其余范围:向
einsum
添加尺寸: