2016-05-30 13 views
6

Robię matrycę przez podział punktowy w macierzy, jednak w macierzy dzielników są pewne zera. Powoduje to ostrzeżenie iw niektórych NaN. Chcę je mapować do 0, co można zrobić tak:Zastąp podział przez zero numpy

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

Jednak istnieją dwa problemy z tym, przede wszystkim, że wciąż daje ostrzeżenie (nie lubię ostrzeżenia) a po drugie wymaga to drugiego przejścia przez macierz (nie jest pewne, czy jest to nieuniknione), a wydajność jest bardzo ważna dla tej części kodu. Pomysły?

+0

Tak więc oznaczałoby to zrobić potrzebujemy drugim przejściu żadnego pojęcia o ostrzeżeniu? –

+2

http://stackoverflow.com/a/26248892/382936 sugeruje użycie 'numpy.errstate (divide = 'ignore')' context, aby wyłączyć ostrzeżenie. Zobacz także http://docs.scipy.org/doc/numpy/reference/generated/numpy.errstate.html#numpy.errstate –

+0

To jest dobre pytanie. Funkcja 'where' również wyzwala ostrzeżenie w wyniku obliczenia wyniku. Maski to prawdopodobnie najlepsza opcja. – Chiel

Odpowiedz

4

Jest to prawdopodobnie najszybszym rozwiązaniem, ale funkcja where ma wywołać błąd, gdyż precalculates rozwiązania:

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

W połączeniu z "z numpy.errstate (divide =" ignore "):" rozwiązuje problem i jest szybszy niż moje własne rozwiązanie, dzięki –

+0

Dodałem typy konwersji, w przeciwnym razie wszystkie podziały dają zero. – Chiel