Bienvenido a seguir mi cuenta de WeChat: Xiao Zhang Python
einsum
El nombre completo es convención de suma de Einstein (convención de suma de Einstein), que representa operaciones de matriz multidimensionales de una manera simple;
Encuentre la suma de los elementos de la matriz
A = ∑ i = 0 n ∑ j = 0 naiaj A = \ sum_ {i = 0} ^ n \ sum_ {j = 0} ^ na_ia_jUN=i = 0∑nj = 0∑nunyounj
Si se utiliza la función einsum, se puede expresar como
A = np.einsum('i',a)
Multiplicación de matrices múltiples
C ik = ∑ j = 1 n A ij B jk C_ {ik} = \ sum_ {j = 1} ^ nA_ {ij} B_ {jk}Cyo k=j = 1∑nUNi jsegundoj k
Expresado como
C_i = np.einsum('ij,jk',a,b)
Encuentre la traza de la traza de la matriz
= ∑ i = 1 n A ii traza = \ sum_ {i = 1} ^ nA_ {ii}t r a c e=i = 1∑nUNi i
La función einsum se puede expresar como
trace = np.einsum('ii',a)
Para operaciones entre matrices, como la suma de productos de matriz y la suma de productos de puntos a lo largo de un cierto eje; enisum proporciona otra representación para operaciones de matriz multidimensional. La lista de etiquetas de subíndice especificada está separada por comas; las enisum
funciones están disponibles en números Pytorch y Tensorflow Implementation, use lo siguiente
np.einsum(subscripts:str,operands:list of array_like)
El parámetro de función de subíndices es un tipo de cadena, el comando de operación representado por, por ejemplo, "ii","ij,jk"
o una matriz de parámetros de matriz de lista representativos de los operandos a calcular;
Hay dos formas para la forma de cadena del parámetro subscrpts en enisum:
1, implicit(隐式模式)
no incluye ->
una etiqueta de identificación y una salida; la matriz de salida se ordenará de acuerdo con el índice de secuencia seleccionado, por ejemplo, np.einsum('ij',a)
para obtener una matriz bidimensional sin cambios, pero la np.einsum('ji',a)
necesidad de transponer la i ,j 轴互换
operación de salida ( ) de la matriz
2, explicit(显式模式)
contiene un identificador ->
y una etiqueta de salida, puede aumentar la flexibilidad de la función, como llamar np.einsum('i->',a)
al efecto es similar np.sum(a,axis = -1)
; el np.einsum('ii->i',a)
equivalente np.diag(a)
; También en el modo explícito, el subíndice de la matriz de salida directa especifica el orden de, por ejemplo, np.einsum('ij,jh->ih',a,b)
representa una matriz multiplicación; las operaciones disponibles por debajo de la corriente son enisum
funciones expresadas;
- Encuentre el rastro de una matriz
numpy.trace
; - Devuelve la diagonal
numpy.diag
- Suma la matriz a lo largo de un eje,
numpy.sum
- Transposición de matriz,
numpy.transpose
- Multiplicación de matrices o producto escalar,
numpy.matmul,numpy.dot
- Vector producto interior y producto exterior,
numpy.inner,numpy.outer
- Difundir, multiplicar píxel por píxel o multiplicar escalar,
numpy.multiply
- Contracción del tensor,
numpy.tensorbot
Sobre la np.enisum()
función algunas castañas:
>>> a = np.arange(25).reshape(5,5)
>>> b = np.arange(5)
>>> c = np.arange(6).reshape(2,3)
1. Calcula la traza de la matriz
>>> np.einsum('ii...->...i',a)
array([-0.796318 , 0.08363816, -0.79171551, 0.36235911])
>>> np.einsum('i...i',a)
-1.1420362461348776
>>> a
array([[-0.796318 , 1.54759498, -0.744291 , 0.02107445],
[ 0.03826498, 0.08363816, 0.92709203, 0.04769788],
[ 0.39088153, -0.85566069, -0.79171551, -1.50750047],
[-1.16165527, 0.77327936, 0.44133708, 0.36235911]])
>>> np.trace(a)
-1.1420362461348776
2. Multiplicación de matrices
>>> b =np.random.rand(4,5)
>>> np.einsum('ij...,jk...->ik...',a,b)
array([[-0.207485 , 0.37929742, -1.14191507, -0.30398675, -0.59431733],
[ 0.03389816, 0.10101184, 0.78917293, 0.41502013, 0.37634113],
[-0.3499671 , -0.45043889, -1.67700784, -0.68798725, -0.49966522],
[-0.2186732 , -0.30529867, -0.21863002, 0.02300085, -0.50540297]])
>>> np.matmul(a,b)
array([[-0.207485 , 0.37929742, -1.14191507, -0.30398675, -0.59431733],
[ 0.03389816, 0.10101184, 0.78917293, 0.41502013, 0.37634113],
[-0.3499671 , -0.45043889, -1.67700784, -0.68798725, -0.49966522],
[-0.2186732 , -0.30529867, -0.21863002, 0.02300085, -0.50540297]])
3. Diagonal
>>> np.einsum('ii->i',a)
array([ 0, 6, 12, 18, 24])
>>> np.diag(a)
array([ 0, 6, 12, 18, 24])
4. Suma a lo largo de un eje de la matriz (debe ejecutarse en modo explícito)
>>> # 沿着某一轴求和,显示模式运行
>>> np.einsum('ij->i',a)
array([ 10, 35, 60, 85, 110])
d
>>> np.sum(a,axis = 1)
array([ 10, 35, 60, 85, 110])
5. Transposición de matriz, cambio de orden de eje
>>> # 计算数组转置,对某些轴重新排序
>>> c
array([[0, 1, 2],
[3, 4, 5]])
>>> np.einsum('ji',c)
array([[0, 3],
[1, 4],
[2, 5]])
>>> np.transpose(c)
array([[0, 3],
[1, 4],
[2, 5]])
6, interior (calcular el producto interior)
>>> np.einsum('i,i',b,b)
30
>>> b
array([0, 1, 2, 3, 4])
>>> np.inner(b,b)# 一维数组,逐像素乘积和
30
7, producto escalar de matriz
>>> np.einsum('ij,j',a,b)
array([ 30, 80, 130, 180, 230])
>>> np.dot(a,b)
array([ 30, 80, 130, 180, 230])
>>> a
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
>>> b
array([0, 1, 2, 3, 4])
>>> np.dot(a[-1],b)# Test
230
8. Multiplicar matrices de tensores
>>> np.einsum(',ij',3,c)
array([[ 0, 3, 6],
[ 9, 12, 15]])
>>> np.multiply(3,c)
array([[ 0, 3, 6],
[ 9, 12, 15]])
>>> # 向量外积
8, mecanismo de difusión, exterior
>>> b
array([0, 1, 2, 3, 4])
>>> np.einsum('i,j',np.arange(2)+1,b)
array([[0, 1, 2, 3, 4],
[0, 2, 4, 6, 8]])
>>> np.outer(np.arange(2)+1,b)
array([[0, 1, 2, 3, 4],
[0, 2, 4, 6, 8]])
9, contracción del tensor, la matriz se contrae y se multiplica a lo largo de un cierto eje
>>> a = np.arange(60).reshape(3,4,5)
>>> b = np.arange(24).reshape(4,3,2)
>>> np.einsum('ijk,jil->kl',a,b)
array([[4400, 4730],
[4532, 4874],
[4664, 5018],
[4796, 5162],
[4928, 5306]])
>>> np.tensordot(a,b,axes = [[1,0],[0,1]])
array([[4400, 4730],
[4532, 4874],
[4664, 5018],
[4796, 5162],
[4928, 5306]])
NOTA : Después de la versión 1.12.0 de numpy, einsum
se agregaron los optimize
parámetros utilizados para optimizar la contraction
operación de la contraction
sección de operación, la operación de la matriz comprende tres o más, optimize
el conjunto de parámetros puede mejorar la eficiencia computacional, reducir la contabilidad de la memoria;
Referencia:
1, https://zhuanlan.zhihu.com/p/71639781
2, https: //numpy.org/doc/stable/reference/generated/numpy.einsum.html