python创建一个数组并返回reshape数组,如何从大数组python创建一个更小的数组

所发生的是每个索引(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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值