我有两个数据集mask
和precip_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
中的第二个元素代表一月份的一天。
基本上,我想将每个纬度/经度的mask
值乘以31天内每个纬度/经度的precip_subset
值。 mask
的值为1
或0
,具体取决于纬度/经度是否超过水位。我最终希望通过将它乘以零来“屏蔽”precip_subset
中水面上的值。
显然,阵列的形状是不同的。有谁知道我能做些什么来实现我想做的事情?
编辑:我在考虑使用for
循环,但我不确定如何构建它。
答案 0 :(得分:0)
如果x.shape
为(1, 220, 140)
且y.shape
为(1, 31, 220, 140)
x[:,None,:,:] * y
应该有效。这就好像x
沿着(新的)第二轴重复了31次。
实际上
x * y
也可以使用,因为(1,220,140)形状扩展到(None,1,220,140)
并扩展到(1,31,220,140)
。但如果第一个维度与1
不同,我们需要明确None
来匹配31
。
这让我想知道形状是不是真的(220, 140)
和(31, 220, 140)
。我没有足够详细地跟踪构造,看看初始尺寸1尺寸是否重要。