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
a
y / ob
pueden 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 invierteTrue
yFalse
en arreglos numpy:print ~ np.array([ True, False, False ])
.c[ ~ np.isfinite( c )] = 0
significa: encuentra las posiciones dondec
es 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/0
manejo agregandoinvalid='ignore'
anumpy.errstate()
numpy.nan_to_num()
para convertirnp.nan
a0
.Código:
Salida:
fuente
0/0
como de1/0
errores.a
ob
contieneNaN
, su solución de repente cede0
como 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.errstate
lí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
arrayA
yarrayB
se han inicializado, peroarrayB
tiene algunos ceros. Podríamos hacer lo siguiente si queremos calcular dearrayC = arrayA / arrayB
forma 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