Numpy divide per zero rilevata in true_divide su np.where ()

Nov 09 2020

Quando ho capito np.whereche cerca di evitare la divisione per zero, ricevo ancora l'errore, anche quando p_arr - 0.5dovrebbe essere sempre > 0.

mo = np.where(p_arr > 0.5, -6.93/(p_arr - 0.5), 10)

RuntimeWarning: divisione per zero rilevata in true_divide

mo = np. dove (p_arr> 0,5, -6,93 / (p_arr - 0,5), 10)

Qualche idea sul perché e su come risolverlo? Inoltre, esiste un modo per eseguire il debug correttamente, quindi l'errore mostrerebbe qual era il valore esatto di p_arr?

Alcuni test:

x = np.where(p_arr > 0.5, p_arr, 1)
print(np.all((p_arr - 0.5 != 0))) # FALSE
print(np.all((x - 0.5 != 0))) # TRUE

Risposte

DanielF Nov 09 2020 at 08:19

pseudocodice per np.where:

def np_where(chooser, true_opt, false_opt):
    out = np.empty(chooser.shape, dtype = true_opt.dtype) 
    out[~chooser] = false_opt
    return out

È importante sottolineare che true_optviene generato prima di chiamare la funzione. Quindi, se qualcosa in esso solleva un errore, l'interprete non può mai chiamare np.where, anche se np.wherenon userebbe mai le parti di true_optciò solleva l'errore.

È possibile eliminare gli divide by zeroerrori, ma non utilizzare np.seterrcome consigliato nell'altra risposta: ciò lo spegnerà per l'intera sessione e potrebbe causare problemi con altri bit di codice. Puoi farlo in questo modo:

with np.errstate(divide='ignore'):
    mo = np.where(p_arr > 0.5, -6.93/(p_arr - 0.5), 10)

Per scoprire da dove proveniva l'errore, usa:

np.where(p_arr == 0.5)

Che dovrebbe darti le coordinate in cui hai ricevuto l' divide by zeroerrore