Einsum¶

If we repeated letters we want those axes multiplied together
If we omit a letter from the output it means that values along that axis will be summed over For 1D arrays
| Call signature | NumPy equivalent | Description | 
|---|---|---|
| ('i', A) | A | returns a view of A | 
| ('i->', A) | sum(A) | sums the values of A | 
| ('i,i->i', A, B) | A * B | element-wise multiplication of A and B | 
| ('i,i', A, B) | inner(A, B) | inner product of A and B | 
| ('i,j->ij', A, B) | outer(A, B) | outer product of A and B | 
For matrices
| Call signature | NumPy equivalent | Description | 
|---|---|---|
| ('ij', A) | A | returns a view of A | 
| ('ji', A) | A.T | view transpose of A | 
| ('ii->i', A) | diag(A) | view main diagonal of A | 
| ('ii', A) | trace(A) | sums main diagonal of A | 
| ('ij->', A) | sum(A) | sums the values of A | 
| ('ij->j', A) | sum(A, axis=0) | sum down the columns of A (across rows) | 
| ('ij->i', A) | sum(A, axis=1) | sum horizontally along the rows of A | 
| ('ij,ij->ij', A, B) | A * B | element-wise multiplication of A and B | 
| ('ij,ji->ij', A, B) | A * B.T | element-wise multiplication of A and B.T | 
| ('ij,jk', A, B) | dot(A, B) | matrix multiplication of A and B | 
| ('ij,kj->ik', A, B) | inner(A, B) | inner product of A and B | 
| ('ij,kj->ikj', A, B) | A[:, None] * B | each row of A multiplied by B | 
| ('ij,kl->ijkl', A, B) | A[:, :, None, None] * B | each value of A multiplied by B | 
Ellipse syntax .... This allows to nod index dimensions:
np.einsum('...ij,ji->...', a, b )
This multiplies the last wo axes of a with an 2d array b.
