Функция einsum
Функция einsum вычисляет произвольные тензорные операции
с использованием соглашения о суммировании Эйнштейна. Первым
параметром функция принимает строку с индексной записью операции,
вторым и последующими параметрами - массивы, над которыми
выполняется операция.
Синтаксис
np.einsum(subscripts, *operands, out=None, dtype=None, order='K', casting='safe', optimize=False)
Пример
Давайте вычислим сумму элементов одномерного массива с использованием соглашения Эйнштейна:
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
res = np.einsum('i->', arr)
print(res)
Результат выполнения кода:
15
Пример
Выполним умножение матриц с помощью einsum.
Рассмотрим две матрицы размером 2x3 и 3x2:
import numpy as np
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([[7, 8], [9, 10], [11, 12]])
res = np.einsum('ij,jk->ik', arr1, arr2)
print(res)
Результат выполнения кода:
[[ 58 64]
[139 154]]
Пример
Вычислим скалярное произведение двух векторов с использованием соглашения Эйнштейна:
import numpy as np
arr1 = np.array([1, 2, 3, 4])
arr2 = np.array([5, 6, 7, 8])
res = np.einsum('i,i->', arr1, arr2)
print(res)
Результат выполнения кода:
70
Пример
Выполним транспонирование двумерного массива с помощью операции перестановки индексов:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
res = np.einsum('ij->ji', arr)
print(res)
Результат выполнения кода:
[[1 4]
[2 5]
[3 6]]
Пример
Вычислим след матрицы с помощью соглашения Эйнштейна (сумма диагональных элементов):
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
res = np.einsum('ii->', arr)
print(res)
Результат выполнения кода:
15
Пример
Выполним вычисление внешнего произведения
двух векторов с помощью einsum:
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
res = np.einsum('i,j->ij', arr1, arr2)
print(res)
Результат выполнения кода:
[[ 4 5 6]
[ 8 10 12]
[12 15 18]]
Пример
Выполним поэлементное умножение двух матриц
с одинаковой размерностью с помощью einsum:
import numpy as np
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
res = np.einsum('ij,ij->ij', arr1, arr2)
print(res)
Результат выполнения кода:
[[ 5 12]
[21 32]]