Какие буквы вы используете в строке осей, не имеет большого значения (но смотрите нижнюю часть этого поста), например, мы можем поставить z
для a
:
>>> A = np.arange(3*4*5).reshape(3,4,5)
>>> B = np.arange(5*2*3).reshape(5,2,3)
>>>
>>> np.einsum('aij,jka->ajk',A,B)
array([[[ 0, 90],
[ 204, 306],
[ 456, 570],
[ 756, 882],
[1104, 1242]],
[[ 110, 440],
[ 798, 1140],
[1534, 1888],
[2318, 2684],
[3150, 3528]],
[[ 380, 950],
[1552, 2134],
[2772, 3366],
[4040, 4646],
[5356, 5974]]])
>>> np.einsum('zij,jkz->zjk',A,B)
array([[[ 0, 90],
[ 204, 306],
[ 456, 570],
[ 756, 882],
[1104, 1242]],
[[ 110, 440],
[ 798, 1140],
[1534, 1888],
[2318, 2684],
[3150, 3528]],
[[ 380, 950],
[1552, 2134],
[2772, 3366],
[4040, 4646],
[5356, 5974]]])
Эквивалент без einsum
:
>>> A.sum(1)[..., None]*B.transpose(2,0,1)
array([[[ 0, 90],
[ 204, 306],
[ 456, 570],
[ 756, 882],
[1104, 1242]],
[[ 110, 440],
[ 798, 1140],
[1534, 1888],
[2318, 2684],
[3150, 3528]],
[[ 380, 950],
[1552, 2134],
[2772, 3366],
[4040, 4646],
[5356, 5974]]])
Идентичность индексных букв имеет значение, если выходные оси неявны, поскольку предполагается, что они в алфавитном порядке
>>> A = np.ones((2,1))
>>> np.einsum('ab', A)
array([[1.],
[1.]])
>>> np.einsum('zb', A)
array([[1., 1.]])