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?
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.
np.multiply
:En lugar de usar
einsum
onp.where
, también se puede usar la funciónnp.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
yfalse_value
, y en su lugar utiliza la funciónnp.tile
para transmitir eficientemente eltruth_value
a través de las dimensiones necesarias.También se puede optimizar aún más la transmisión utilizando la función
np.broadcast_arrays
para transmitir explícitamente los arreglostruth_value
yfalse_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
yfalse_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.