2017-08-04 81 views
0

兩個數組的值我有兩個數據集maskprecip_subset。兩個數據集都以類似的方式創建的:如何乘具有不同的形狀

掩模:

datapath = r"C:\Users\matth\Downloads\mask_global_0.25deg.nc" 
f = Dataset(datapath) 
print(f) 

latbounds = [ -45 , -10 ] 
lonbounds = [ 105, 160 ] 
lats = f.variables['lat'][:] 
lons = f.variables['lon'][:] 

# latitude lower and upper index 
latli = np.argmin(np.abs(lats - latbounds[0])) 
latui = np.argmin(np.abs(lats - latbounds[1])) 

# longitude lower and upper index 
lonli = np.argmin(np.abs(lons - lonbounds[0])) 
lonui = np.argmin(np.abs(lons - lonbounds[1])) 

mask = f.variables['mask'][ lonli:lonui , latli:latui ] 

precip_subset:

data_path = r"C:\Users\matth\Downloads\TRMM_3B42RT\3B42RT_Daily.201001.7.nc4" 
f = Dataset(data_path) 

latbounds = [ -45 , -10 ] 
lonbounds = [ 105, 160 ] 
lats = f.variables['lat'][:] 
lons = f.variables['lon'][:] 

# latitude lower and upper index 
latli = np.argmin(np.abs(lats - latbounds[0])) 
latui = np.argmin(np.abs(lats - latbounds[1])) 

# longitude lower and upper index 
lonli = np.argmin(np.abs(lons - lonbounds[0])) 
lonui = np.argmin(np.abs(lons - lonbounds[1])) 

precip_subset = f.variables['precipitation'][ : , lonli:lonui , latli:latui ] 

每個數據集的形狀有(1, 220, 140)(1, 31, 220, 140)。每個數據集中的最後兩個元素分別代表緯度和經度。 precip_subset中的第二個元素表示1月份的一天。

基本上,我想通過在31天的每個緯度/經度的的precip_subset值在每個緯度/經度相乘的mask值。的mask的值是10,取決於如果緯度/經度是過水。我最終想要通過乘以零來「掩蓋」precip_subset中的數值。

顯然,陣列的形狀是不同的。有誰知道我能做些什麼來實現我想做的事情?

編輯:我在想,也許利用for循環,但我不知道如何構建。

+1

你試過'面具* precip_subset'。 Numpy會播出這個,應該沒問題。在genereal廣播規則中查看[here](https://docs.scipy.org/doc/numpy/user/basics.broadcasting.html)。 –

+1

請儘量少做例子,就我所見,你的問題主要是關於乘兩個數組,我想我們甚至不必知道這些數組是如何構成的,以及這些數組是如何構建的 –

回答

1

如果x.shape(1, 220, 140)y.shape(1, 31, 220, 140)

x[:,None,:,:] * y 

應該工作。這就好像x沿(新)第2軸被複制了31次。

其實

x * y 

也將工作,因爲(1220140)形狀擴展到(None,1,220,140)和上(1,31,220,140)。但如果第一個維度與1不同,我們需要明確None以匹配31

這讓我想知道是否形狀是不是真的(220, 140)(31, 220, 140)。我沒有足夠詳細地查看構造,以確定初始尺寸1的尺寸是否顯着。

相關問題