Saltar al contenido

Cómo devolver 0 con dividir por cero

Contamos con tu apoyo para compartir nuestros artículos sobre las ciencias de la computación.

Solución:

En numpy v1.7+, puede aprovechar la opción “dónde” para ufuncs. Puede hacer cosas en una línea y no tiene que lidiar con el administrador de contexto errstate.

>>> a = np.array([-1, 0, 1, 2, 3], dtype=float)
>>> b = np.array([ 0, 0, 0, 2, 2], dtype=float)

# If you don't pass `out` the indices where (b == 0) will be uninitialized!
>>> c = np.divide(a, b, out=np.zeros_like(a), where=b!=0)
>>> print(c)
[ 0.   0.   0.   1.   1.5]

En este caso, realiza el cálculo de división en cualquier lugar “donde” b no sea igual a cero. Cuando b es igual a cero, permanece sin cambios con respecto al valor que le dio originalmente en el argumento ‘fuera’.

Sobre la base de la respuesta de @Franck Dernoncourt, arreglando -1/0:

def div0( a, b ):
    """ ignore / 0, div0( [-1, 0, 1], 0 ) -> [0, 0, 0] """
    with np.errstate(divide='ignore', invalid='ignore'):
        c = np.true_divide( a, b )
        c[ ~ np.isfinite( c )] = 0  # -inf inf NaN
    return c

div0( [-1, 0, 1], 0 )
array([0, 0, 0])

Sobre la base de las otras respuestas, y mejorando en:

  • 0/0 manejo agregando invalid='ignore' para numpy.errstate()
  • introduciendo numpy.nan_to_num() para convertir np.nan para 0.

Código:

import numpy as np

a = np.array([0,0,1,1,2], dtype='float')
b = np.array([0,1,0,1,3], dtype='float')

with np.errstate(divide='ignore', invalid='ignore'):
    c = np.true_divide(a,b)
    c[c == np.inf] = 0
    c = np.nan_to_num(c)

print('c: 0'.format(c))

Producción:

c: [ 0.          0.          0.          1.          0.66666667]

Acuérdate de que te brindamos la opción de explicar si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *