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.

Asignación eficiente de valores de numpy a través de máscara booleana.

Tengo un problema de asignación de valores de máscara booleana que requiere una operación de máscara booleana eficiente.

Es una máscara multidimensional y estoy usando einsum para lograr el resultado, pero la operación no es muy eficiente, y me pregunto si alguien puede ayudarme con ella.
Aquí está mi solución actual: (tanto mask, truth_value, false_value son datos ficticios con dtype y forma que coinciden con mi problema.


mask = np.random.randn(1000, 50)> 0.5
truth_value = np.random.randn(50, 10)
false_value = np.random.randn(10)
objective = np.einsum('ij,jk->ijk', mask, truth_value) + np.einsum('ij,k->ijk', ~mask, false_value)

¿Hay alguna forma más rápida de obtener objective dado mask, truth_value, false_value?

Mientras esperaba, descubrí una forma más rápida.

objective = np.where(mask[...,np.newaxis], np.broadcast_to(truth_value, (1000, 50, 10)), np.broadcast_to(false_value, (1000, 50, 10)))

¿Pero hay alguna alternativa más rápida?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en Python y Numpy, existen algunas alternativas potenciales que se pueden explorar para mejorar la eficiencia de la operación de máscara booleana.

    1. Uso de la función np.multiply:
      En lugar de usar einsum o np.where, también se puede usar la función np.multiply para lograr el mismo resultado. Esto se puede hacer de la siguiente manera:

    objetivo = np.multiply(np.tile(truth_value, (mask.shape[0], 1, 1)), mask[..., np.newaxis]) + np.multiply(false_value, ~mask[..., np.newaxis])

    Este enfoque evita la creación de copias innecesarias de los arreglos truth_value y false_value, y en su lugar utiliza la función np.tile para transmitir eficientemente el truth_value a través de las dimensiones necesarias.

    1. Optimización de la transmisión:
      También se puede optimizar aún más la transmisión utilizando la función np.broadcast_arrays para transmitir explícitamente los arreglos truth_value y false_value a través de las dimensiones requeridas:

    tv_broadcasted, fv_broadcasted = np.broadcast_arrays(truth_value, np.expand_dims(false_value, axis=0))
    objetivo = np.where(mask[..., np.newaxis], tv_broadcasted, fv_broadcasted)

    Este enfoque debería ser más rápido ya que evita copias innecesarias de los arreglos truth_value y false_value y optimiza aún más la transmisión.

    En resumen, existen múltiples enfoques que se pueden adoptar para optimizar la operación de máscara booleana. La elección del enfoque dependerá de los requisitos y restricciones específicos de la aplicación en cuestión.

Comments are closed.