Función eval de Python con matrices numpy mediante entrada de cadenas con diccionarios

Estoy implementando el código en python que tiene las variables almacenadas en vectores numpy. Necesito realizar una operación simple: algo como (vec1 + vec2 ^ 2) / vec3. Cada elemento de cada vector se sum y multiplica. (análogo de MATLAB elementwise. * operación).

El problema está en mi código que tengo un diccionario que almacena todos los vectores:

var = {'a':np.array([1,2,2]),'b':np.array([2,1,3]),'c':np.array([3])} 

El tercer vector es solo 1 número, lo que significa que quiero multiplicar este número por cada elemento en otras matrices como 3 * [1,2,3]. Y al mismo tiempo tengo una fórmula que se proporciona como una cadena:

  formula = '2*a*(b/c)**2' 

Estoy reemplazando la fórmula usando Regexp:

  formula_for_dict_variables = re.sub(r'([Az][A-z0-9]*)', r'%(\1)s', formula) 

que produce resultado:

  2*%(a)s*(%(b)s/%(c)s)**2 

y sustituir las variables del diccionario:

  eval(formula%var) 

En el caso, entonces solo tengo números puros (no numerosos arreglos), todo funciona, pero cuando coloco numpy.arrays en dict, recibo un error.

  1. ¿Podría dar un ejemplo de cómo puedo resolver este problema o sugerirle un enfoque diferente? Dado que los vectores se almacenan en el diccionario y la fórmula es una entrada de cadena.

  2. También puedo almacenar variables en cualquier otro contenedor. El problema es que no sé el nombre de las variables y la fórmula antes de la ejecución del código (las proporciona el usuario).

  3. También creo que la iteración a través de cada elemento en los vectores probablemente será lenta dado que Python para los bucles son lentos.

Usando numexpr , entonces podrías hacer esto:

 In [143]: import numexpr as ne In [146]: ne.evaluate('2*a*(b/c)**2', local_dict=var) Out[146]: array([ 0.88888889, 0.44444444, 4. ]) 

Pase el diccionario a la función eval python:

 >>> var = {'a':np.array([1,2,2]),'b':np.array([2,1,3]),'c':np.array([3])} >>> formula = '2*a*(b/c)**2' >>> eval(formula, var) array([ 0.8889, 0.4444, 4. ])