如何乘具有不同的形状
问题描述:
两个数组的值我有两个数据集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
中的第二个元素表示1月份的一天。
基本上,我想通过在31天的每个纬度/经度的的precip_subset
值在每个纬度/经度相乘的mask
值。的mask
的值是1
或0
,取决于如果纬度/经度是过水。我最终想要通过乘以零来“掩盖”precip_subset
中的数值。
显然,阵列的形状是不同的。有谁知道我能做些什么来实现我想做的事情?
编辑:我在想,也许利用for
循环,但我不知道如何构建。
答
如果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的尺寸是否显着。
你试过'面具* precip_subset'。 Numpy会播出这个,应该没问题。在genereal广播规则中查看[here](https://docs.scipy.org/doc/numpy/user/basics.broadcasting.html)。 –
请尽量少做例子,就我所见,你的问题主要是关于乘两个数组,我想我们甚至不必知道这些数组是如何构成的,以及这些数组是如何构建的 –