2016-04-11 7 views
1

私のスクリプトに関する質問があり、あなたの助けや私の問題を解決するためのアイデアが欲しいです。マスク条件の後に2D配列を取得

私はデータを持つ2D配列を持っています。私は他の2D配列でそれを分割したいと思います。これまでは問題ではありません。 しかし、私はある条件に置く:、最後に:私はことを書い= 1

をこの両方の配列は、バイナリマスクを占め取るだけのピクセルを取る必要があります:

fig10, (ax1, ax2, ax3) = plt.subplots(1,3) 

fig = plt.gcf() 
fig.set_size_inches(16, 9) 

# ARRAYS TAKE ACCOUNT PIXEL = 1 IN THE BINARY GRID 
convolution_mask_locale_data = convolution_mask_locale[grid.T == 1] 
convolution_mask_grande_data = convolution_mask_grande[grid.T == 1] 

convolution_locale_data = convolution_locale[grid.T == 1] 
convolution_grande_data = convolution_grande[grid.T == 1] 

# FIRST STEP DIVIDE 
step1 = convolution_locale_data/convolution_mask_locale_data 

fig_step1 = ax1.imshow(step1, interpolation='nearest') 
fig10.colorbar(fig_step1,ax=ax1) 
ax1.set_xlabel("X (arcmin)") 
ax1.set_ylabel("Y (arcmin)") 

# SECOND STEP DIVIDE 
step2 = convolution_grande_data/convolution_mask_grande_data 

fig_step2 = ax2.imshow(step2, interpolation='nearest') 
fig10.colorbar(fig_step2,ax=ax2) 
ax2.set_xlabel("X (arcmin)") 
ax2.set_ylabel("Y (arcmin)") 

# SUBSTRACT BOTH RESULTS 
S_N_map = step1 - step2 

fig_S_N_map = ax3.imshow(S_N_map, interpolation='nearest') 
fig10.colorbar(fig_S_N_map,ax=ax3) 
ax3.set_xlabel("X (arcmin)") 
ax3.set_ylabel("Y (arcmin)") 

fig10.tight_layout()   
fig10.savefig(outname10) 

をしかし、私は問題を取得します私はヒートマップと同じことをする必要があります。しかし、私がgrid.T条件で配列を扱うとき、私の2D配列は1D配列になり、操作を行うことはできません。

私はどのように処理することができますか? おそらくそれは完全にはっきりしていないかもしれません。そして私は非常に悪い英語には申し訳ありません。

ありがとうございました!

EDIT:

変数grid.Tは私ピクセルの星(値1)または無(値0)を持っている場合を示しているバイナリアレイ(0または1)です。

enter image description here

変数convolution_mask_localガウスによって畳み込まれる前grid.Tを表します。また、OliverW BY 2D配列

enter image description here

ソリューションです。 。

私は私のスクリプトがOliverWによって与えられた溶液を更新し、私はこの取得:

fig10, (ax1, ax2, ax3) = plt.subplots(1,3) 

fig = plt.gcf() 
fig.set_size_inches(16, 9) 

mask = binary_mask == 0 

A = np.ma.masked_array(convolution_locale, mask = mask) 
B = np.ma.masked_array(convolution_mask_locale, mask = mask) 

C = np.ma.masked_array(convolution_grande, mask = mask) 
D = np.ma.masked_array(convolution_mask_grande, mask =mask) 

step1 = A/B 
step2 = C/D 


fig_step1 = ax1.imshow(step1, interpolation='nearest') 
fig10.colorbar(fig_step1,ax=ax1) 
ax1.set_xlabel("X (arcmin)") 
ax1.set_ylabel("Y (arcmin)") 


fig_step2 = ax2.imshow(step2, interpolation='nearest') 
fig10.colorbar(fig_step2,ax=ax2) 
ax2.set_xlabel("X (arcmin)") 
ax2.set_ylabel("Y (arcmin)") 

# SUBSTRACT BOTH RESULTS 
S_N_map = step1 - step2 

fig_S_N_map = ax3.imshow(S_N_map, interpolation='nearest') 
fig10.colorbar(fig_S_N_map,ax=ax3) 
ax3.set_xlabel("X (arcmin)") 
ax3.set_ylabel("Y (arcmin)") 

fig10.tight_layout()  
fig10.savefig(outname10) 

を、私はこれらのプロットを取得する(1秒は非常に良好に動作するようだが、ために最初ではありません不明な理由):

enter image description here

+0

変数 'grid'とは何ですか? 'convolution_mask_locale'とは何ですか?あなたの事例を[最小で完全で検証可能な例]にしてください(http://stackoverflow.com/help/mcve)。 –

+0

@OliverW。ごめんなさいOliverW、私は可能な限り明確になるために私の質問を編集しました。多くの詳細があるので、何かを忘れた可能性があります;) – Deadpool

答えて

2

あなたがいくつかの要素を無視することができ、2Dアレイ(マスクされた)を可視化することに興味がいるようです。

この機能はnumpy(numpy's masked arrays)の下に存在し、matplotlibも同様に機能します。論理インデックスとする配列(b/c)[~mask]は1Dの形状を得ている間、マスクされたアレイは、BCは、それらの2D形状を保持する方法

>>> import numpy as np 
>>> import matplotlib.pyplot as plt 
>>> a = np.random.random_integers(0,1, (3,3)) # generate some fake data 
>>> a 
array([[1, 1, 0], 
     [0, 1, 0], 
     [1, 0, 0]]) 
>>> mask = a == 0 
>>> b = np.random.random_integers(0,9, a.shape) # more fake data 
>>> c = np.random.random_integers(1,9, a.shape) # more fake data 
>>> b 
array([[9, 5, 2], 
     [9, 7, 5], 
     [4, 4, 2]]) 
>>> c 
array([[4, 9, 4], 
     [5, 5, 9], 
     [5, 7, 3]]) 
>>> B = np.ma.masked_array(b, mask=mask) # initialize a masked array 
>>> C = np.ma.masked_array(c, mask=mask) 
>>> B 
masked_array(data = 
[[9 5 --] 
[-- 7 --] 
[4 -- --]], 
      mask = 
[[False False True] 
[ True False True] 
[False True True]], 
     fill_value = 999999) 
>>> C 
masked_array(data = 
[[4 9 --] 
[-- 5 --] 
[5 -- --]], 
      mask = 
[[False False True] 
[ True False True] 
[False True True]], 
     fill_value = 999999) 
>>> B/C # you can divide these 2D matrices element-wise, the mask is retained 
masked_array(data = 
[[2.25 0.5555555555555556 --] 
[-- 1.4 --] 
[0.8 -- --]], 
      mask = 
[[False False True] 
[ True False True] 
[False True True]], 
     fill_value = 1e+20) 
>>> (b/c)[~mask] 
array([ 2.25  , 0.55555556, 1.4  , 0.8  ]) 

注意:以下

は一例です。これは通常であり、インデックス作成の仕方によっては、numpyは論理的にインデックスされた配列をストライドで表現できるかどうかを知ることはできません(一般にはできません)ので、配列を平坦化します。ただし、マスクされた配列を使用すると、以前と同じように作業を続けることができます。マスクは操作の間に保持され、コードの最後の2行からわかるように、同じ値が2次元配列にあります。

最後に、マスクされた配列を視覚化することができます。

plt.imshow(B/C, interpolation='none') 

をし、それはあなたに(彼らは白い背景の上に白いピクセルになりますこれは、透明いる意味私の場合には、)いくつかの値がマスクされている3x3のグリッドを表示します:ちょうど呼び出します。

+0

あなたの答えは非常に興味深いです!私はプロセスをよく理解しています!あなたのスクリプトで質問を編集しています。しかし、私はなぜ半分だけうまく動作するのか分からない。私は質問の最後に結果を掲示します;) – Deadpool

+0

私の最初のプロットでは、良くない(> 100)いくつかの値があります。私は "new_step1 = step1 [step1 <100]"と書いていますが、new_step1は2D配列ではなく1D配列になります。プロセスの仕組みについてのアイデアはありますか? – Deadpool

+0

@ Astrolabe1993、あなたの第1軸と第3軸の画像が期待していない理由は、基本的な値のためです。スケールバーを見てください;-)あなたが(ax3のために)巨大な数から小さな数を引くと、あなたはまだまだ巨大な数になります。したがって、ax3はax1と非常によく似ています。私は視覚的表現でそれ以上のものを手助けすることはできません。あなたは 'convolution_mask_locale'をどのように作成しているのか、他の人たちはなぜそれらの数値が非常に大きいのかを見てください。 –

関連する問題