我有一个大小为[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的数组。你知道吗
是否有一些简单的函数或代码,我忽略了这将很容易为我做到这一点?谢谢你的帮助!你知道吗
所以,我最终完全放弃了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.排名作为额外的奖励模块。你知道吗你绝对可以使用屏蔽多维数组。但是,必须确保掩码和数据的大小相同。你知道吗
请注意,只要不使用
np.newaxis
添加一个额外的轴,就可以将掩码与原始数据数组相乘而不会出现问题。np.all
的keepdims=True
参数意味着维度的数量是相同的,因此mask
可以直接与precip
相乘,这是由于Numpy's broadcasting机制。例如:相关问题 更多 >
编程相关推荐