2015-10-20 2 views
0

Например,Как понять результат этого np.einsum ('kij', A)?

A = np.arange(24).reshape((2, 3, 4)) 
print np.einsum('ijk', A) 

это еще A без проблем.

Но если да, то print np.einsum('kij', A) Форма (3, 4, 2). Не должно быть (4, 2, 3)?

Результат print np.einsum('cab', A) форма (4, 2, 3) без проблем тоже. Почему print np.einsum('kij', A) не то же самое?

+0

Вы должны означать 'A = np.arange (24) .reshape ((2,3,4))' –

+1

Также 'np.einsum ('cab', A) .shape == (3, 4, 2)' , а не '(4, 2, 3)' –

+1

Я получаю '(3, 4, 2)' как 'kij', так и' cab'. –

ответ

2

Если указать только один набор индексов, они интерпретируются как порядок измерений в входного массива относительно выхода, а не наоборот.

Например:

import numpy as np 

A = np.arange(24).reshape((2, 3, 4)) 
B = np.einsum('kij', A) 

i, j, k = np.indices(B.shape) 

print(np.all(B[i, j, k] == A[k, i, j])) 
# True 

Как @hpaulj отметил в комментариях, вы можете сделать соответствие между входными и выходными размерами более явными, указав оба набора индексов:

# this is equivalent to np.einsum('kij', A) 
print(np.einsum('kij->ijk', A).shape) 
# (3, 4, 2) 

# this is the behavior you are expecting 
print(np.einsum('ijk->kij', A).shape) 
# (4, 2, 3) 
+0

imean, когда я использую «кабину», форма результата 4,2,3, но когда я использую «kij», форма результата равна 3,4,2, я думаю, что оба они должны быть, 2,3 – Crazymage

+0

Я не могу реплицируйте поведение, которое вы описываете, используя либо numpy v1.9.2, v1.8.2, либо v1.6.0. Я всегда получаю форму вывода '(3, 4, 2)' как для 'np.einsum ('kij', A)' и 'np.einsum ('cab', A)'. –

+0

О, теперь я знаю, что то, что я хочу делать с «kij», должно выполняться с помощью «ijk-> kij», но я до сих пор не понимаю, что такое «kij», почему результат (3,4,2) .. – Crazymage

Смежные вопросы