Article Categories
- All Categories
-
Data Structure
-
Networking
-
RDBMS
-
Operating System
-
Java
-
MS Excel
-
iOS
-
HTML
-
CSS
-
Android
-
Python
-
C Programming
-
C++
-
C#
-
MongoDB
-
MySQL
-
Javascript
-
PHP
-
Economics & Finance
Extract the diagonal of a matrix with Einstein summation convention in Python
The Einstein summation convention provides a concise way to express array operations. The numpy.einsum() method implements this convention, allowing us to extract matrix diagonals using subscript notation like 'ii->i'.
Understanding Einstein Summation for Diagonals
The subscript 'ii->i' means we take elements where both indices are equal (diagonal elements) and output them as a 1D array. The repeated index i on the left indicates we want elements at positions (0,0), (1,1), (2,2), etc.
Basic Example
Here's how to extract diagonal elements from a 4x4 matrix ?
import numpy as np
# Create a 4x4 matrix
arr = np.arange(16).reshape(4, 4)
print("Original Matrix:")
print(arr)
# Extract diagonal using Einstein summation
diagonal = np.einsum('ii->i', arr)
print("\nDiagonal elements:")
print(diagonal)
Original Matrix: [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15]] Diagonal elements: [ 0 5 10 15]
How It Works
The notation 'ii->i' can be broken down as follows:
-
iion the left: Input array with indices i,i (same index repeated) -
->: Arrow separating input from output specification -
ion the right: Output array with single index i
Comparison with Traditional Methods
Let's compare einsum with NumPy's built-in diag() function ?
import numpy as np
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# Method 1: Using einsum
diagonal_einsum = np.einsum('ii->i', matrix)
# Method 2: Using diag()
diagonal_diag = np.diag(matrix)
print("Matrix:")
print(matrix)
print("\nUsing einsum:", diagonal_einsum)
print("Using diag():", diagonal_diag)
print("Results match:", np.array_equal(diagonal_einsum, diagonal_diag))
Matrix: [[1 2 3] [4 5 6] [7 8 9]] Using einsum: [1 5 9] Using diag(): [1 5 9] Results match: True
Advanced Example with Different Matrix Types
Einstein summation works with different data types and matrix sizes ?
import numpy as np
# Float matrix
float_matrix = np.random.rand(3, 3).round(2)
print("Float Matrix:")
print(float_matrix)
print("Diagonal:", np.einsum('ii->i', float_matrix))
# Complex matrix
complex_matrix = np.array([[1+2j, 3+4j], [5+6j, 7+8j]])
print("\nComplex Matrix:")
print(complex_matrix)
print("Diagonal:", np.einsum('ii->i', complex_matrix))
Float Matrix: [[0.37 0.95 0.73] [0.6 0.16 0.06] [0.7 0.02 0.97]] Diagonal: [0.37 0.16 0.97] Complex Matrix: [[1.+2.j 3.+4.j] [5.+6.j 7.+8.j]] Diagonal: [1.+2.j 7.+8.j]
Key Parameters
| Parameter | Description | Example |
|---|---|---|
| subscripts | String specifying summation indices | 'ii->i' |
| operands | Input arrays for the operation | matrix |
| optimize | Controls path optimization | True/False |
Conclusion
The numpy.einsum() method with 'ii->i' notation provides an elegant way to extract matrix diagonals. While equivalent to np.diag(), einsum offers more flexibility for complex array operations and follows mathematical notation conventions.
