2017-01-27 1 views
1

インデックス画像binsは複数の領域で構成されています。 0はバックグラウンドで、その他の正の値は領域です。別の配列に基づいてインデックス画像をすばやく再現する方法

私は例えば、別の配列に基づいて、各地域の値を入力します。:

bins = # image of shape (height, width), type int 
ids = np.array([1, 5, ... ]) # region ids 
values = np.array([0.1, ...]) # Values for each region, same shape as ids 
img = np.empty(bins.shape, 'float32') 
img[:] = np.nan 
for i, val in zip(ids, values): 
    img[bins == i + 1] = val 

が、このループはPythonで、超遅いです。それを素晴らしいnumpyの方法で書く方法がありますか?

ありがとうございます!ここで

答えて

2

はアプローチだ -

out = np.take(values, np.searchsorted(ids, bins-1)) 
out.ravel()[~np.in1d(bins,ids+1)] = np.nan 

これをソートするidsを前提としていますのでご注意ください。そうでない場合は、オプションの引数sorternp.searchsortedと使用する必要があります。


ここでは非常によく似た考え方を持つ別のものだが、マイナーな微調整として初期化を使用し、唯一の有効な要素にnp.searchsortedの使用を制限する -

out = np.full(bins.shape, np.nan) 
mask = np.in1d(bins,ids+1) 
out.ravel()[mask] = np.take(values, np.searchsorted(ids+1, bins.ravel()[mask])) 
関連する問題