所发生的是每个索引(where)数组的长度将不同,因此输出数组的形状不明确,因此出现错误。要强制广播到正确的形状,您必须重塑数组以广播到正确的形状,如下所示:Windspeedsplains = Defaultwindspeed[goodtime[0][:, None, None, None],:,goodlat[0][:,None],plainslon[0]]
存在[0]是因为np.where(a)返回一个长度为a.ndim的元组,元组的每个元素都是符合您条件的索引数组。我假设所有的布尔数组都是1d,所以所有的where输出都是长度为1的元组,所以我们只需要其中的一个数组,因此[0]。在
在我们得到数组之后,我们需要对它进行整形,以匹配您希望输出数组具有的形状。可以假设,输出应该具有的形状是(goodtime.size, Defaultwindspeed.shape[1], goodlat.size, plainslon.size),因此必须使每个索引数组都具有与该变量的输出数组应该沿的轴相匹配的形状。例如,对于goodtime,您希望Windspeedplains沿4轴的0随时间变化。因此,goodtime本身也必须仅沿四个轴的0轴变化,所以您强制索引数组具有(N, 1, 1, 1)的形状,这就是[:, None, None, None]的作用。在
因此,您可以使用以下命令使上述行更具可读性:
^{pr2}$
或者实际上,因为您可以直接用布尔数组索引:goodtime = ((Time>=1948)&(Time<2013))[:, None, None, None]
goodlat = ((Lat>=35)&(Lat<=50))[:, None]
plainslon = ((Lon>=275)&(Lon<=285))
Windspeedsplains=Defaultwindspeed[goodtime, :, goodlat, plainslon]
下面是一个比较简单的例子:In [52]: a = np.arange(3*3*3).reshape(3,3,3)
In [53]: a
Out[53]:
array([[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8]],
[[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]],
[[18, 19, 20],
[21, 22, 23],
[24, 25, 26]]])
In [54]: mask0 = np.where(a[:,0,0] >= 9)
In [55]: mask0
Out[55]: (array([1, 2]),) # < this is the length 1 tuple I was talking about. we want the array inside.
In [56]: mask1 = np.where(a[0,:,0]%2 == 0)
In [57]: mask1
Out[57]: (array([0, 2]),)
In [62]: mask2 = np.where(a[0,0,:] < 1)
In [63]: mask2
Out[63]: (array([0]),)
In [67]: b = a[mask0[0][:, None, None], mask1[0][:, None], mask2[0]]
In [68]: b
Out[68]:
array([[[ 9],
[15]],
[[18],
[24]]])
In [69]: b.shape
Out[69]: (2, 2, 1)