Numpy einsum可以用于重塑操作数的形状吗?

Numpy einsum可以用于重塑操作数的形状吗?,numpy,numpy-einsum,Numpy,Numpy Einsum,我正在尝试将以下代码段修改为不使用重塑 a = np.random.randn(1, 2, 3, 5) b = np.random.randn(2, 5, 10) np.einsum("ijkl,mjl->kim", a, b.reshape(10,2,5)) 起初,我认为重塑只是转置操作数,但它似乎比这更复杂。是否可以在不重塑的情况下执行此操作?您是正确的,重塑与转置不同。在某种程度上,转置会改变数据的顺序,而重塑则不会einsum可以用作转置,而不是重塑。从(2

我正在尝试将以下代码段修改为使用
重塑

a = np.random.randn(1, 2, 3, 5)
b = np.random.randn(2, 5, 10)

np.einsum("ijkl,mjl->kim", a, b.reshape(10,2,5))

起初,我认为重塑只是转置操作数,但它似乎比这更复杂。是否可以在不重塑的情况下执行此操作?

您是正确的,重塑与转置不同。在某种程度上,转置会改变数据的顺序,而重塑则不会
einsum
可以用作转置,而不是重塑。从(2,5,10)重塑为(10,2,5)与
转置(2,0,1)
不同。尝试使用一个小整数数组,在那里可以看到更改
einsum
可以进行转置,并对维度进行求和)。给定这些数组维度,并希望对大小2和5维度的乘积进行求和,我将使用
np.einsum('ijkl,jlm->kim',a,b)
生成一个(3,1,10)数组。没有必要转换
b
维度(或者更不用说“重塑”它们)。@hpaulj我确实想缩小尺寸2和5维度,但它们被压缩到了维度10-我认为只有从根本上改变
b
的形状(这是我试图避免的)才能进行此操作。如果
b
的形状是
(2,5,2,5)
我可以做
np.einsum('ijkl,mnjl->kimn',a,b)。重塑(3,1,-1)
,但我需要重塑
b
以某种方式将维度10分解为(2,5),进一步思考重塑(2,5,10)到(10,2,5)不是问题,因为两者都重塑为(2,5,2,5)甚至(10,10)。(20,5)到(5,20)将是一个问题。最后一个
einsum
的默认顺序是“ikmn”。由您决定
b
中的哪个(2,5)和
a
中的(2,5)配对。无论如何,如果有必要,不要害怕进行单独的
重塑
(甚至
转置
)。这些操作并不昂贵。