Evalúe el orden de contracción de menor costo para una expresión einsum en Python

En este artículo, veremos cómo evaluar la contracción de menor costo para una expresión einsum en Python.

método np.einsum_path

Para obtener el orden de contracción de menor costo para una expresión einsum en Python , use la función numpy .einsum path(). La convención de suma de Einstein se puede utilizar para representar varias operaciones comunes de arrays algebraicas lineales multidimensionales. En modo implícito, Einsum calcula estos valores. Einsum brinda flexibilidad adicional para calcular operaciones de array alternativas que pueden no considerarse operaciones de suma de Einstein estándar en modo explícito al deshabilitar o forzar la suma en las etiquetas de subíndice definidas. La ruta indica qué términos deben contratarse primero, y el resultado se adjunta al final de la lista de contracciones. Esta lista se puede repetir hasta que se hayan completado todas las contracciones intermedias.

Sintaxis: np.einsum_path(subíndices, *operandos, optimizar=’codicioso’):

Parámetros:

  • subíndices: tipo de string. Se especifican los subíndices para la suma.
  • *operandos: lista de objetos tipo array. Estas son las arrays de la operación.
  • optimizar: {bool, lista, tupla, ‘codicioso’, ‘óptimo’}. Seleccione el tipo de ruta.

Devoluciones:

  • ruta: lista de tuplas. La ruta einsum se representa como una lista.
  • string_repr: string. El camino einsum como representación imprimible.

Ejemplo

Las bibliotecas se importan aquí y el método np.random.rand() se usa para generar arrays de números aleatorios. Hacemos tres arreglos llamados a, b y c. La contracción de menor costo para una expresión einsum se evalúa utilizando el método np.einsum path(). Comencemos con una ilustración de punto de string. Los tensores b y c deben contraerse primero en esta situación, como lo muestra el primer elemento del camino (1, 2). La contracción final (0, 1) se completa agregando el tensor resultante al final de la contracción.

Python3

# importing packages
import numpy as np
  
# setting seed
np.random.seed(101)
  
# creating random arrays
a = np.random.rand(2, 2)
print(a)
b = np.random.rand(2, 3)
print(b)
c = np.random.rand(3, 2)
print(c)
  
# lowest cost contraction order for an einsum expression
path = np.einsum_path('ij,jk,kl->il', a, b, c, optimize='greedy')
  
# Path info
print(path[0])
print(path[1])

Producción:

[[0.51639863 0.57066759]

 [0.02847423 0.17152166]]

[[0,68527698 0,83389686 0,30696622]

 [0.89361308 0.72154386 0.18993895]]

[[0.55422759 0.35213195]

 [0.1818924 0.78560176]

 [0.96548322 0.23235366]]

[‘einsum_ruta’, (1, 2), (0, 1)]

  Contracción completa: ij,jk,kl->il

         Escalado ingenuo: 4

     Escalado optimizado: 3

      Recuento de FLOP ingenuo: 7.200e+01

  Recuento de FLOP optimizado: 4.100e+01

   Aceleración teórica: 1.756

  Mayor intermedio: 4.000e+00 elementos

————————————————————————––

escala de corriente restante

————————————————————————––

   3 kl,jk->jl ij,jl->il

   3 jl,ij->il il->il

Publicación traducida automáticamente

Artículo escrito por isitapol2002 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *