Estoy tratando de realizar una división inteligente de elementos en Python, pero si se encuentra un cero, necesito que el cociente sea cero.
Por ejemplo:
array1 = np.array([0, 1, 2])
array2 = np.array([0, 1, 1])
array1 / array2 # should be np.array([0, 1, 2])
Siempre podría usar un bucle for a través de mis datos, pero para utilizar realmente las optimizaciones de numpy, necesito que la función de división devuelva 0 al dividir por cero errores en lugar de ignorar el error.
A menos que me esté perdiendo algo, no parece que numpy.seterr () pueda devolver valores en caso de errores. ¿Alguien tiene alguna otra sugerencia sobre cómo podría obtener lo mejor de numpy mientras establezco mi propia división por manejo de cero errores?
python
arrays
numpy
error-handling
divide-by-zero
hlin117
fuente
fuente

Respuestas:
En numpy v1.7 +, puede aprovechar la opción "where" para ufuncs . Puede hacer cosas en una línea y no tiene que lidiar con el administrador de contexto de estado de error.
En este caso, realiza el cálculo de la división en cualquier lugar 'donde' b no sea igual a cero. Cuando b es igual a cero, entonces permanece sin cambios con respecto al valor que le dio originalmente en el argumento 'out'.
fuente
ay / obpueden ser matrices de números enteros, entonces es el mismo concepto, solo necesita establecer explícitamente el tipo de salida correcto:c = np.divide(a, b, out=np.zeros(a.shape, dtype=float), where=b!=0)out=np.zeros_like(a)es fundamental, como se indica en la línea comentada.np.divide(a, b, out=np.zeros_like(a), where=b!=0), obtengo el errorAssigning to function call which doesn't return. Lo extraño es que lo uso dos veces y el error solo aparece una vez.Sobre la base de la respuesta de @Franck Dernoncourt, arreglando -1 / 0:
fuente
~se invierteTrueyFalseen arreglos numpy:print ~ np.array([ True, False, False ]).c[ ~ np.isfinite( c )] = 0significa: encuentra las posiciones dondeces finito, inviértelas para que NO sean finitas~y establezca los valores no finitos en 0. Consulte también stackoverflow.com/search?q=[numpy]+"boolean+indexing "Aprovechando las otras respuestas y mejorando:
0/0manejo agregandoinvalid='ignore'anumpy.errstate()numpy.nan_to_num()para convertirnp.nana0.Código:
Salida:
fuente
0/0como de1/0errores.aobcontieneNaN, su solución de repente cede0como resultado. Esto puede ocultar fácilmente errores en su código y es absolutamente inesperado.numpy.nan_to_num(x, copy=True, nan=0.0, posinf=None, neginf=None)es la firma.One-liner (lanza advertencia)
fuente
Intente hacerlo en dos pasos. División primero, luego reemplace.
La
numpy.errstatelínea es opcional y solo evita que numpy le diga sobre el "error" de dividir por cero, ya que usted ya tiene la intención de hacerlo y está manejando ese caso.fuente
np.errstate(divide='ignore'):divide='warn'también podría ser útil si desea que se le notifique.También puede reemplazar basado en
inf, solo si los tipos de matriz son flotantes, según esta respuesta :fuente
Una respuesta que encontré al buscar una pregunta relacionada fue manipular la salida en función de si el denominador era cero o no.
Supongamos que
arrayAyarrayBse han inicializado, peroarrayBtiene algunos ceros. Podríamos hacer lo siguiente si queremos calcular dearrayC = arrayA / arrayBforma segura.En este caso, siempre que tengo una división por cero en una de las celdas, configuro la celda para que sea igual a
myOwnValue, que en este caso sería ceroNota al pie: en retrospectiva, esta línea es innecesaria de todos modos, ya que
arrayC[i]se instancia a cero. Pero si fuera el casomyOwnValue != 0, esta operación haría algo.fuente
Otra solución que vale la pena mencionar:
fuente