2016-05-30 7 views
6

行列を点分割していますが、除数マトリックスにはいくつかのゼロがあります。この結果、警告が表示され、一部のNaNでは発生します。私はこれらが私はこのように行うことができます0、にマップする:ゼロで除算を置換する

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

しかし、この2つの問題があるが、すべての最初のそれはまだ、すべての警告(私は警告を好きではない)と第二を与えますこれは、マトリックス上の2番目のパスを必要とします(これがやむを得ないかどうかはわかりません)。コードのこの部分で効率が非常に重要です。アイデア?

+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

これはnumpy.errstate(divide = 'ignore')と組み合わせて:問題を解決し、自分の解決策よりも速いです。 –

+0

私は型変換を追加しました。 – Chiel