如何将具有不同形状的两个数组的值相乘

时间:2017-08-04 03:22:32

标签: python arrays numpy

我有两个数据集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中的第二个元素代表一月份的一天。

基本上,我想将每个纬度/经度的mask值乘以31天内每个纬度/经度的precip_subset值。 mask的值为10,具体取决于纬度/经度是否超过水位。我最终希望通过将它乘以零来“屏蔽”precip_subset中水面上的值。

显然,阵列的形状是不同的。有谁知道我能做些什么来实现我想做的事情?

编辑:我在考虑使用for循环,但我不确定如何构建它。

1 个答案:

答案 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尺寸是否重要。