2015-01-30 17 views
5

‘np.einsum documentation belgesinde anladığım, bir permütasyon dizisinin, bir vektördeki eksenin permütasyonunu vermesidir. Bu husus aşağıdaki deneyle teyit edilir:Axes permütasyonu elde etmek için numpy einsum

>>> M = np.arange(24).reshape(2,3,4) 
>>> M.shape 
(2, 3, 4) 
>>> np.einsum('ijk', M).shape 
(2, 3, 4) 
>>> np.einsum('ikj', M).shape 
(2, 4, 3) 
>>> np.einsum('jik', M).shape 
(3, 2, 4) 

Ama bu anlayamıyorum:

>>> np.einsum('kij', M).shape 
(3, 4, 2) 

ben beklenebilir (4, 2, 3) yerine ... benim anlayış nesi var? Çıktı imza belirtilmediğinde

cevap

7

o verilmiş bulunuyor harfleri alıp alfabetik düzenleyerek olarak oluşturur, einsum (yani alt simgeler dizede hiçbir '->' yoktur).

Bu

np.einsum('kij', M) 

aslında

np.einsum('kij->ijk', M) 

Yani 'kij' etiketleri giriş matriks eksenleri değil çıkış matrisi yazılmasına eşdeğerdir anlamına gelir ve bu permütasyonu yol açar gözlemlediğiniz eksenler.

Bu nokta belgelerinde açıkça yapılmazsa, ancak C source code for einsum yılında yorumladı görülebilir:

/* 
* If there is no output signature, create one using each label 
* that appeared once, in alphabetical order 
*/ 

amaçlanan sırayla sırası değiştirilebilir edilir M eksenlerini sağlamak için, vermek gerekebilir einsum hem giriş ve çıkış matrisleri için etiketleme: Yani

>>> np.einsum('ijk->kij', M).shape 
(4, 2, 3) 
+0

dize (benim anlayış) permütasyon tersini temsil ... –

+0

Evet, düşünmek için iyi bir yol ne olabilir çıkış, çıkış imzası verilmediğinde olacaktır. –

İlgili konular