es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo declarar relaciones entre símbolos de SymPy

Tengo el siguiente código que debería ordenar una “matriz” de NumPy basada en el orden de los elementos de la primera “fila”. Estoy tratando con variables de SymPy, las cuales no tienen un orden directo.

import sympy as sym
import numpy as np

a = sym.symbols("a", positive=True)
b = sym.symbols("b")

arr_num = np.array([[1.5, 3, 0], [.5, .4, .1]])
arr_sym_a = np.array([[a, 2*a, 0], [.5, .4, .1]])
arr_sym_b = np.array([[a, b, 0], [.5, .4, .1]])

def order(array):
    return array[:, np.argsort(array)][:, 0]

print(order(arr_num))
print(order(arr_sym_a))
print(order(arr_sym_b))

Para arr_num, obtengo la salida esperada:

[[0.  1.5  3. ]
 [0.1 0.5 0.4]]

Como se puede ver arriba, ya sé cómo declarar una variable como positiva para que np.argsort ordene 0<a<2*a, y=”” obtengo=”” la=”” salida=”” esperada=”” para=”” order(arr_sym_a):=”” ="" [[0="" a="" 2*a]="" [0.1="" 0.5="" 0.4]]=""=”” la=”” pregunta=”” es=”” si=”” hay=”” alguna=”” forma=”” similar=”” de=”” indicarle=”” a=”” sympy=”” que=”” b="">a y luego obtener:

[[0 a b]
 [0.1 0.5 0.4]]

Hasta ahora, he estado obteniendo el mensaje de error “TypeError: cannot determine truth value of Relational”, lo cual no es sorprendente ya que no hay forma de que np.argsort pueda saber que a>b.

Gracias.</a<2*a`,>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Basado en la implementación actual, no es posible informar a SymPy sobre el orden relativo de variables como b > a, lo cual resulta en el error “TypeError: no se puede determinar el valor de verdad de Relational”. Esto se debe a que la implementación actual se basa en la capacidad de np.argsort para realizar el ordenamiento basado en los valores de los elementos del array. Sin embargo, los símbolos de SymPy no tienen un orden natural y el ordenamiento debe ser definido explícitamente.

    Una posible solución alternativa para obtener el resultado deseado para arr_sym_b sería definir manualmente una correspondencia entre los valores de los símbolos y su orden, y luego utilizar esta correspondencia para transformar los elementos del array antes de llamar a np.argsort. Por ejemplo, se podría definir un diccionario como {‘a’: 1, ‘b’: 2}, y luego utilizar np.vectorize para aplicar una función lambda que busque el valor de cada símbolo en el diccionario y devuelva el valor entero correspondiente. El array resultante transformado puede luego ser ordenado utilizando np.argsort.

    symbol_order = {'a': 1, 'b': 2}
    
    def order(array):
        sym_to_int = np.vectorize(lambda s: symbol_order.get(str(s), -1))
        int_array = sym_to_int(array)
        return array[:, np.argsort(int_array)][:, 0]
    
    print(order(arr_sym_b))
    

    Esto produciría la siguiente salida:

    [[0 a b]
     [0.1 0.5 0.4]]
    

    Tenga en cuenta que esta solución alternativa asume que el conjunto de valores de los símbolos se conoce de antemano y que la correspondencia valor-orden se define manualmente. Puede no ser adecuada para casos en los que el conjunto de símbolos y sus ordenamientos deben determinarse dinámicamente.

Comments are closed.