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.

La función de Python no acepta matrices como entradas.

Esta función funciona bien con una entrada única como se muestra en el Ejemplo 1, pero cuando quiero ejecutarla utilizando arrays como entradas, falla (como se indica en el Ejemplo 2). No quiero usar un bucle for para calcular la función para cada elemento de los arrays d, l y b. Porque es lento. Lo que quiero hacer es que la función tenga que usar el i-ésimo elemento de cada array d, l y b como entrada y calcular los resultados y dar los resultados como un array que tenga el mismo tamaño que d, l y b. En el Ejemplo 2, el resultado debería ser un array de 2 elementos que es array([17.8, 22.4]). Pero no está funcionando como esperaba.

import numpy as np

def mydef(d, l, b):
    dd = 0.1
    ds = np.arange(0, d+dd, dd)
    return np.sum(l*ds+b)

#Ejemplo 1
print(mydef(.2, 3, 4))
print(mydef(.3, 4, 5))
#Ejemplo 2
d=np.array([.2, .3])
l=np.array([3, 4])
b=np.array([4, 5])
print(mydef(d, l, b))

El Ejemplo 2 da

ValueError: La verdad de un array con más de un elemento es ambigua. Use a.any() o a.all()

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La implementación actual de la función mydef crea un array ds usando la función np.arange, el cual tendrá una forma diferente a los arrays de entrada d, l y b. Por lo tanto, cuando la función intenta realizar las operaciones de multiplicación y suma, las formas de estos arrays no coinciden, lo que provoca el error.

    Para calcular la función para cada elemento de d, l y b sin usar un bucle for, podemos utilizar la característica de broadcasting de NumPy. El broadcasting permite a NumPy realizar operaciones entre arrays de formas diferentes, siempre que sus formas sean compatibles.

    Una forma de modificar la función mydef para utilizar el broadcasting es:

    import numpy as np
    
    def mydef(d, l, b):
        dd = 0.1
        ds = np.arange(0, np.max(d)+dd, dd)
        ds = np.expand_dims(ds, axis=-1)
        l = np.expand_dims(l, axis=-2)
        b = np.expand_dims(b, axis=-2)
        return np.sum(l*ds+b, axis=-1)
    

    Aquí, primero encontramos el valor máximo de d usando np.max, y luego creamos el array ds para tener la misma forma que l y b, utilizando np.expand_dims para agregar una nueva dimensión a ds a lo largo del último eje. Hacemos lo mismo para l y b, pero agregamos una nueva dimensión a lo largo del penúltimo eje (es decir, el eje antes del último). Esto garantiza que la operación de suma se realice correctamente a lo largo del último eje, que corresponde a los elementos de d.

    Con estas modificaciones, la función debería calcular correctamente los resultados para el Ejemplo 2 sin usar un bucle for.

Comments are closed.