2017-08-04 82 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的尺寸是否显着。

相关问题