2017-08-04 10 views
0

私は2つのデータセットmaskprecip_subsetを持っています。両方のデータセットは、同様の方法で作成された:形状の異なる2つの配列の値を掛ける方法

マスク:

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)です。各データセットの最後の2つの要素は、それぞれ緯度と経度を表します。 precip_subsetの2番目の要素は、1月の1日を表します。

基本的には、各緯度/経度でのmaskの値には、31日間の各緯度/経度でprecip_subsetという値を掛けたいと考えています。 maskの値は、緯度/経度が水面上にあるかどうかによって、1または0のいずれかになります。私は最終的に水を超えている値をゼロで乗算することによってprecip_subsetの値を「隠す」ことを望む。明らかに、アレイの形状が異なる。私がやりたいことを達成するために何ができるのか誰にでも分かっていますか?

編集:おそらくforループを利用していると考えていましたが、どのように構築するのか分かりません。

+1

'mask * precip_subset'を試したことがありますか?ナンシーはこれを放送し、それはうまくいくはずです。ジェネラル放送ルールでの[here](https://docs.scipy.org/doc/numpy/user/basics.broadcasting.html)を参照してください。 –

+1

そして最小限の例を作ってください。あなたの質問が主に2つの配列を掛け合っていることがわかります。私は緯度と配列がどのように構築されているか知る必要はないと思います –

答えて

1

x.shape(1, 220, 140)y.shapeある場合は(1, 31, 220, 140)

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

が動作するはずです。これは、xが(新しい)2番目の軸に沿って31回複製されたように機能します。 (1220140)形状を(None,1,220,140)および(1,31,220,140)上に展開されているので

は実際

x * y 

も、動作します。しかし、最初の次元が1と異なる場合、31に一致するように明示的にNoneする必要があります。

これは、実際に形状が(220, 140)(31, 220, 140)ではないかと思います。私は最初のサイズの次元が重要であるかどうかを確認するのに十分詳細に構造を追跡していません。

関連する問題