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()
davy.ai
La implementación actual de la función
mydef
crea un arrayds
usando la funciónnp.arange
, el cual tendrá una forma diferente a los arrays de entradad
,l
yb
. 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
yb
sin usar un buclefor
, 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:Aquí, primero encontramos el valor máximo de
d
usandonp.max
, y luego creamos el arrayds
para tener la misma forma quel
yb
, utilizandonp.expand_dims
para agregar una nueva dimensión ads
a lo largo del último eje. Hacemos lo mismo paral
yb
, 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 ded
.Con estas modificaciones, la función debería calcular correctamente los resultados para el Ejemplo 2 sin usar un bucle
for
.