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 arreglar el error de ‘bitwise_and’ en la comprensión de listas y optimizar el ciclo for?

Tengo el siguiente bucle for a continuación, pero quiero convertirlo en una variante más eficiente computacionalmente. Pensé que podría hacerlo con comprensión de listas, pero esto me está dando el siguiente error:

TypeError: ufunc ‘bitwise_and’ no es compatible con los tipos de entrada, y las entradas no se pueden convertir de manera segura a ningún tipo compatible según la regla de conversión de ‘seguro’

EDITAR I: Estoy intentando comparar input1 e input2 y si input1 es mayor que input2, entonces la diferencia debe ser elevada al cuadrado y escalada por el escalador. De lo contrario, se debe asignar un valor de cero a la salida.

¿Cómo puedo solucionar esto y hay otra forma de acelerar aún más esto?

Variables de entrada

input1 = np.array([0.5, 1, 3, 7, 10])
input2 = np.array([0.5, 1.5, 2, 7, 8])
escalador = 3

Bucle for

salida = np.zeros(len(input1))
for i in range(len(input1)):
if input1[i] > input2[i]:
salida[i] = escalador * (input1[i] – input2[i])**2
else:
salida[i] = 0

Intento de comprensión de listas, pero da error.

salida = [escalador * (input1-input2)**2 for i in input1 & input2 if input1 > input2]

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    En primer lugar, el error está ocurriendo porque el operador ‘&’ no se utiliza para comparar dos elementos de dos arrays. En este caso, es necesario utilizar la función ‘logical_and’ de numpy.

    En segundo lugar, su comprensión de lista no es equivalente al bucle for ya que la condición ‘if input1 > input2’ no se está aplicando correctamente.

    Para solucionarlo con una comprensión de lista, puede utilizar un operador ternario anidado de la siguiente manera:

    output = [(scaler * (input1[i]-input2[i])**2) if input1[i] > input2[i] else 0 for i in range(len(input1))]
    

    Esto le dará el resultado deseado utilizando una comprensión de lista. Sin embargo, esto no necesariamente será más rápido que su bucle for.

    Un método alternativo que puede proporcionar un impulso de rendimiento es utilizar la vectorización en lugar del bucle for o la comprensión de lista. Simplemente puede utilizar la función de indexación lógica de numpy de la siguiente manera:

    output = np.zeros(len(input1))
    output[np.logical_and(input1 > input2, np.isfinite(input1))] = scaler * (input1[np.logical_and(input1 > input2, np.isfinite(input1))] - input2[np.logical_and(input1 > input2, np.isfinite(input1))])**2
    

    Este código le proporcionará el mismo resultado que su bucle for original y la comprensión de lista corregida, pero con un rendimiento potencialmente más rápido.

    ¡Espero que esto ayude!

Comments are closed.