2016-05-30 38 views
6

Matris noktaya bölünme ile matris yapıyorum, ancak bölen matrisinde bazı sıfırlar var. Bu bir uyarı ve bazı NaN'lerde sonuçlanır. Bunları böyle yapabiliriz 0, eşlemek istiyorum:Bölmeyi sıfıra göre değiştir

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

Ancak bu iki sorunları vardır, her şeyden önce yine bütün bir uyarı (Ben uyarıları sevmiyorum) ve ikinci verir Bu, matris üzerinde ikinci bir geçişi gerektirir (bu kaçınılmaz olup olmadığından emin değil) ve kodun bu kısmı için etkinlik çok önemlidir. Fikirler?

+0

Evet yani bu ikinci geçiş, uyarı ile ilgili herhangi bir ipucu gerekiyor demek ki? –

+2

http://stackoverflow.com/a/26248892/382936, uyarıyı bastırmak için 'numpy.errstate (divide = 'ignore')' bağlamını kullanmanızı önerir. Ayrıca bkz. Http://docs.scipy.org/doc/numpy/reference/generated/numpy.errstate.html#numpy.errstate –

+0

Bu iyi bir sorudur. Bir '' '' işlevi de sonuç hesaplanırken uyarıyı tetikler. Maskeler muhtemelen en iyi seçeneğinizdir. – Chiel

cevap

4

Bu muhtemelen en hızlı çözüm, ancak çözüm precalculates olarak where işlev hataya neden vermez:

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

"numpy.errstate (divide = 'ignore') ile birlikte:" sorunu çözer ve kendi çözümümden daha hızlıdır, teşekkürler –

+0

Tür dönüşümleri ekledim, aksi takdirde bölümler sıfır verir. – Chiel