2016-05-30 21 views
6

Sto facendo una matrice per divisione in senso puntuale della matrice, tuttavia ci sono alcuni zeri nella matrice dei divisori. Ciò si traduce in un avvertimento e in alcuni NaN. Voglio che questi per mappare a 0, che posso fare in questo modo:Sostituisci divisione con zero numpy

edge_map = (xy/(x_norm*y_norm)) 
edge_map[np.isnan(edge_map)] = 0 

Tuttavia ci sono due problemi con questo, prima di tutto dà ancora un avvertimento (non mi piace avvisi) e la seconda di tutti ciò richiede un secondo passaggio sulla matrice (non è sicuro se ciò è inevitabile) e l'efficienza è molto importante per questa parte del codice. Idee?

+0

Sì quindi questo vorrebbe dire ho bisogno il secondo passaggio, qualsiasi indizio circa l'avvertimento? –

+2

http://stackoverflow.com/a/26248892/382936 suggerisce di utilizzare il contesto 'numpy.errstate (divide = 'ignora')' per sopprimere l'avviso. Vedi anche http://docs.scipy.org/doc/numpy/reference/generated/numpy.errstate.html#numpy.errstate –

+0

Questa è una buona domanda. Una funzione 'where' attiva anche l'avviso quando viene calcolato il risultato. Le maschere sono probabilmente la tua migliore opzione. – Chiel

risposta

4

Questa è probabilmente la soluzione più veloce, ma la funzione where fa scattare l'errore in quanto precalculates le soluzioni:

import numpy as np 

n = 4 

xy = np.random.randint(4, size=(n,n)).astype(float) 
x_norm = np.random.randint(4, size=(n,n)).astype(float) 
y_norm = np.random.randint(4, size=(n,n)).astype(float) 

xy_norm = x_norm*y_norm 

edge_map = np.where(xy_norm == 0, xy_norm, xy/xy_norm) 

print(xy) 
print(xy_norm) 
print(edge_map) 
+2

Questo insieme a "con numpy.errstate (divide = 'ignore'):" risolve il problema ed è più veloce della mia soluzione, grazie –

+0

Ho aggiunto conversioni di tipi, altrimenti le divisioni danno zero. – Chiel

Problemi correlati