2016-07-08 3 views
0

私はnumpy.whereを使用していますが、使用されていないパラメータを呼び出さないようにする簡単な方法があるかどうかは疑問でした。例:numpy.where:評価パラメータを遅らせる方法は?

import numpy as np 
z = np.array([-2, -1, 0, 1, -2]) 
np.where(z!=0, 1/z, 1) 

リターン:

array([-0.5, -1. , 1. , 1. , -0.5]) 

しかしzが0だったとき、それはそれを使用していなくても、コードはまだ1/zを評価するので、私はゼロ警告による除算を取得します。

あなたがマスクを適用することができます
+0

なぜz = z [np.nonzero(z)]をzで除算するのですか?しかし、それはちょうど1を返します。理由はわかりません。 –

+0

'1/z'がインタープリタによって'where'を呼び出す部分。それは 'どこで'の管理下にありません。しかし、あなたは 'out [ind] = 1/z [ind]'を実行できます。ここで 'ind'はok値のマスクです。ゼロで割り切れる方法は他にもあります。 – hpaulj

+0

[numpy]タグと[divide-by-zero]タグを検索する – hpaulj

答えて

1

out = numpy.ones_like(z) 
mask = z != 0 
out[mask] = 1/z[mask] 
1

ます。また、警告をオフにして、コンテキストマネージャerrstate使用 を行われた後、オンに戻すことができます:

with np.errstate(divide='ignore'): 
    np.where(z!=0, 1/z, 1)