2015-01-30 18 views
5

Điều tôi hiểu trong tài liệu về ‘np.einsum’ là một chuỗi hoán vị, sẽ cho phép hoán vị của trục trong một vectơ. Đây là khẳng định của các thí nghiệm sau:numpy einsum để có được hoán vị trục

>>> 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) 

Nhưng điều này tôi không thể hiểu:

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

tôi mong chờ (4, 2, 3) thay vì ... Có gì sai với sự hiểu biết của tôi?

Trả lời

7

Khi chữ ký đầu ra không được chỉ định (nghĩa là không có '->' trong chuỗi đăng ký), einsum sẽ tạo bằng cách lấy các chữ cái được đặt và sắp xếp chúng theo thứ tự bảng chữ cái.

Điều này có nghĩa rằng

np.einsum('kij', M) 

thực sự là tương đương với

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

Vì vậy, viết 'kij' nhãn các trục của đầu vào ma trận, không phải là ma trận đầu ra, và điều này dẫn đến sự hoán vị của các trục mà bạn quan sát được.

Điểm này không được thực hiện rõ ràng trong tài liệu, nhưng có thể được nhìn thấy lần lấy ý kiến ​​trên C source code for einsum:

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

Để đảm bảo các trục của M được hoán vị theo thứ tự đích, nó có thể là cần thiết để cung cấp cho einsum việc ghi nhãn cho cả các ma trận đầu vào và đầu ra:

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

vì vậy (trong sự hiểu biết của tôi) chuỗi đại diện cho nghịch đảo của hoán vị ... –

+0

Vâng, đó có thể là một cách tốt để suy nghĩ về những gì đầu ra sẽ là khi chữ ký đầu ra không được đưa ra. –

Các vấn đề liên quan