为三维阵列创建布尔遮罩

2024-06-28 19:39:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大小为[2000x7200x40](我们称之为precip)的3D numpy数组,我想将某些值(-9999)隐藏起来,以便从scipy.mstats.rankdata(precip,axis=2,use_missing=False)分类中排除。你知道吗

把数据想象成:

[-9999, 2, 3, 5, -9999
       4, 7, -9999, 6]...

我这样做基本上是不成功的;似乎大多数np.ma函数(如np.ma.masked_invalid)只适用于一维数组。你知道吗

时间序列(z)中的每个数组的-9999值可能不同。你知道吗

我尝试过numpy函数,例如:

 #mask the -9999 values out
   mask = np.empty_like(precip)
   mask = ~(precip == -9999).all(axis=2,keepdims=True)

然后用mask = [numpy.newaxis,:,:]将其广播到三维阵列

然而,这将导致一个2000x7200x1数组,当与precip相乘时抛出一个维度错误,因为它需要一个维度为40的数组。你知道吗

是否有一些简单的函数或代码,我忽略了这将很容易为我做到这一点?谢谢你的帮助!你知道吗


Tags: 函数numpyfalseusenp分类maskscipy
2条回答

所以,我最终完全放弃了mstats排名方法;当一整行都被屏蔽时,它就会停止。你知道吗

最后我使用了上面的屏蔽码: mask = ~(precip == -9999).all(axis=2, keepdims=True)

apply_along_axis(lambda a: scipy.stats.ranking(a), axis=2, precip))方法之后

然后ranks = ranks*mask做了一个技巧来掩盖降水数据中总是-9999的值。你知道吗

希望这能帮助那些对mstats.ranking感到困惑的人在将来回吐一个0-D数组错误。这个scipy.stats.排名模块似乎也比scipy.mstats.排名作为额外的奖励模块。你知道吗

你绝对可以使用屏蔽多维数组。但是,必须确保掩码和数据的大小相同。你知道吗

>>> mask = ~(precip == -9999).all(axis=2, keepdims=True)
>>> mask.shape
(2000, 7200, 1)
>>> repeated_mask = np.repeat(mask, precip.shape[-1], axis=-1) # Ensure same shape
>>> repeated_mask.shape == precip.shape
True
>>> ma = np.ma.masked_array(precip, mask=repeated_mask)
>>> ma.shape == precip.shape
True

请注意,只要不使用np.newaxis添加一个额外的轴,就可以将掩码与原始数据数组相乘而不会出现问题。np.allkeepdims=True参数意味着维度的数量是相同的,因此mask可以直接与precip相乘,这是由于Numpy's broadcasting机制。例如:

>>> mask = ~(precip == -9999).all(axis=2, keepdims=True)
>>> mask.shape
(2000, 7200, 1)
>>> (precip * mask).shape == precip.shape # `mask` will be broadcast to the shape of `precip`
True

相关问题 更多 >