2016-04-11 11 views
1

Komut dizim hakkında bir sorum var ve sorununuzu çözmeniz için herhangi bir fikriniz veya herhangi bir fikriniz olsun.Maske koşulundan sonra 2D dizisi alın

Verilerle birlikte bir 2D dizilim var ve bunu diğer bir 2B dizisiyle bölmek istiyorum. Şimdiye kadar, sorun değil. Ama bir koşul koymak: sonda:

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) 

Ama bir sorunum olsun: Bu her iki diziler ikili maske hesabı alıp sadece pikselleri almalıdır = 1.

ben yazdım Bir ısı haritasıyla aynı şeyi almam gerek. Ama dizilerimle grid.T durumunun üstesinden geldiğimde, 2B dizim 1D dizisi olur ve işlem yapamıyorum.

Nasıl işleyebileceğim hakkında bir fikriniz var mı? Belki de tamamen açık değil ve çok kötü İngilizce'm için üzgünüm.

Teşekkür ederiz!

DÜZENLEME:

değişken grid.T bir ikili dizidir (0 veya 1) (değer 1) veya hiçbir şey benim piksel yıldızları varsa belirten (değer 0).

enter image description here

değişken convolution_mask_local Gauss tarafından konvolüsyon önceki grid.T temsil eder. Ayrıca OliverW TARAFINDAN ÇÖZÜM 2D dizi

enter image description here

bu. :.

Ben OliverW tarafından verilen çözüm ile benim programı güncellemek, bu edinin:

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) 

Bunları araziler olsun (ikincisi çok iyi iş gibi görünüyor, ama için ilk değil bilinmeyen bir nedenle):

enter image description here

+0

"Izgara" değişkeni nedir? Convolution_mask_locale nedir? Lütfen örneklerinizi [minimal, eksiksiz ve doğrulanabilir bir örnek] haline getirin (http://stackoverflow.com/help/mcve). –

+0

@OliverW. Tamam, OliverW, sorumu mümkün olduğu kadar açık hale getirmek için düzenledim. Çok fazla detayım olduğu için, bir şeyi unuttum;) – Deadpool

cevap

2

size bazı elementler) (maskeli göz ardı edilebilir nereye 2D diziler görselleştirme ilgilendiğiniz görünüyor.

Neyse ki, bu işlev numpy (numpy's masked arrays) altında bulunmaktadır ve matplotlib bunlarla da çalışabilir. mantıksal endeksli dizi (b/c)[~mask] 1B şekil elde etti ise maskelenmiş diziler, B ve C, 2 boyutlu şeklini muhafaza nasıl

>>> 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  ]) 

Not: Aşağıda

bir örnektir. Bu normaldir ve dizinlemenin çalışma biçimi nedeniyle: mantıksal olarak dizine eklenmiş dizinin stridlerle (genel olarak yapamaz) gösterilebiliyorsa, numpy önceden bilinemez, bu nedenle diziyi düzleştirir. Ancak maskelenmiş dizileri kullanarak, alıştığınız şekilde çalışmaya devam edebilirsiniz. Maske işlemler arasında saklanır ve son iki kod satırından da görebileceğiniz gibi, aynı değerler 2D dizisinde bulunur.

Son olarak, maskelenen diziyi görselleştirebilirsiniz.

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

ve size (onlar beyaz zemin üzerine beyaz piksel sonuçlanacak şeffaf demektir benim durumumda,) bazı değerler maskelenmiş bir 3x3 ızgara, gösterecektir: Sadece diyoruz.

+0

Cevabınız çok ilginç! Süreci daha iyi anlıyorum! Sorumu senaryonunla düzenliyorum. Ama, neden sadece yarısı iyi çalışıyor bilmiyorum. Sonucumu sorgumun sonunda yayınlıyorum;) – Deadpool

+0

İlk grafiğimde, iyi olmayan bazı değerler var (> 100). "New_step1 = step1 [step1 <100]" yazarım ama new_step1 yerine 2D dizisi (istediğim) için 1D dizisi olur. Süreç hakkında bir fikrin var mı? – Deadpool

+0

@ Astrolabe1993, ilk ve üçüncü eksen resminizin beklediğiniz gibi olmadığının nedeni, temel değerlerden kaynaklanmaktadır. Scalebarlara bakın ;-) (Ax3 için) büyük bir sayıdan küçük bir sayı çıkardığınızda, yine de büyük bir sayı ile sonuçlanırsınız. Yani ax3, ax1'e çok benziyor. Görsel temsili ile bundan daha fazla yardımcı olamıyorum: “convolution_mask_locale” yi nasıl yarattığınıza ve diğerlerinin bu sayıların neden bu kadar büyük olduğunu (yani beklediğiniz gibi) görebildiğinize dikkat etmelisiniz. –

İlgili konular