np.einsum (acuerdo de suma de Einstein)

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 = 0nj = 0nunyounj
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 = 1nUNi 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 = 1nUNi 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 enisumfunciones 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 enisumfunciones expresadas;

  • Encuentre el rastro de una matriz numpy.trace;
  • Devuelve la diagonalnumpy.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, einsumse agregaron los optimizeparámetros utilizados para optimizar la contractionoperación de la contractionsección de operación, la operación de la matriz comprende tres o más, optimizeel 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

Supongo que te gusta

Origin blog.csdn.net/weixin_42512684/article/details/112598472
Recomendado
Clasificación