2017-01-31 8 views
1

私は3D画像スキャン(形状:335x306x306、合計要素:31368060)を持っています。同じサイズのマスクされたイメージを返すために同じサイズ。Python:3Dブールで3D配列をインデックスし、同じサイズの3D配列を返します。

Iは単にインデックスようにマスクを持つ配列:

masked_image = image_pix[mask] 

Iマスク= 1標準行メジャー(Cスタイル)によって順序付けされた画像の画素値の1次元配列を取得(hereの説明のとおり)。マスキングのために6953600要素しかありません。

インデックスを持たない場合、この1Dアレイを3Dアレイに再形成するにはどうすればよいですか?私はマスクのインデックスを使って、マスクされた値を3D配列に反復的に取り込むことができることを認識していますが、forループに依存しないより洗練された(そして計算効率の良い)ソリューションが望まれます。

答えて

1

使用np.ma.MaskedArray

marr = np.ma.array(image_pix, mask=mask) 

(それはアイテムを失ったので)それが再び3Dに整形することができることを何garantueeがないので[mask]と「通常」のインデックスがすべてマスクされた値を削除しますので、それができないのです。


しかしMaskedArray sがその形状を保つ:

>>> import numpy as np 

>>> arr = np.random.randint(0, 10, 16).reshape(4, 4) 

>>> marr = np.ma.array(arr, mask=arr>6) 

>>> marr.shape 
(4, 4) 

>>> marr 
masked_array(data = 
[[3 -- 0 1] 
[4 -- 6 --] 
[2 -- 6 0] 
[4 5 0 0]], 
      mask = 
[[False True False False] 
[False True False True] 
[False True False False] 
[False False False False]], 
     fill_value = 999999) 
0

私はちょうど長く少しの間これについて考えて、私は論理的なインデックスによって、これを達成できることに気づきました。簡単でした

masked_image = image_pix # define the masked image as the full image 
masked_image[mask==0] = 0 # define the pixels where mask == 0 as 0 

...

+0

あなたはコピーを行う必要が変更されていない、あなたの 'image_pix'が必要な場合:' masked_image = image_pix.copy() '。 – MSeifert