2016-05-30 76 views
6

我正在通過矩陣逐點除法來完成矩陣,但除數矩陣中有一些零。這導致警告並在一些NaN中。我想這些映射到0,這是我可以這樣做:用零numpy替代除數

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

但也有與此兩個問題,首先它仍然給所有的警告(我不喜歡的警告)和第二這需要對矩陣進行第二遍(不確定這是否是不可避免的),並且效率對於這部分代碼非常重要。想法?

+0

是這樣,這將意味着我需要做第二遍,有關警告任何線索? –

+2

http://stackoverflow.com/a/26248892/382936建議使用'numpy.errstate(divide ='ignore')'上下文來抑制警告。另見http://docs.scipy.org/doc/numpy/reference/generated/numpy.errstate.html#numpy.errstate –

+0

這是一個很好的問題。計算結果時,where函數也會觸發警告。面具可能是你最好的選擇。 – Chiel

回答

4

這可能是最快的解決方案,但因爲它預先計算的解決方案where功能不觸發錯誤:

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

這與「with numpy.errstate(divide ='ignore'):」解決了問題,並且比我自己的解決方案更快,謝謝 –

+0

我已經添加了類型轉換,否則分區都會給零。 – Chiel