问题描述
我有一个 numpy 掩码 nd 数组。我需要找到沿特定轴的中位数。在某些情况下,我最终会得到偶数个元素,在这种情况下,numpy.ma.median
给出中间两个元素的平均值。但是,我不想要平均值。我想要中间元素之一。两者中的任何一个都可以。我如何得到这个?
MWE:
>>> import numpy
>>> data=numpy.arange(-5,10).reshape(3,5)
>>> mdata=numpy.ma.masked_where(data<=0,data)
>>> numpy.ma.median(mdata,axis=0)
masked_array(data=[5.0,3.5,4.5,5.5,6.5],mask=[False,False,False],fill_value=1e+20)
如您所见,它正在求平均值(1
和 6
)并提供小数值 (3.5
)。我想要 1
或 6
中的任何一个。
解决方法
对于偶数个元素,中位数返回两个中间数的平均值。但是,如果您不想要平均值,只想要两个中间数字中的一个,您可以从集合中删除一个元素,同时调用使集合长度为奇数的中值方法,并且你会得到你想要的,而不是平均值(虽然这不是找到中位数的正确方法)
,当您有偶数个元素时,预计会平均。 假设您有从 1 到 10 的元素数组。平均值预计为 5 和 6 的平均值,即 5.5。如果您有 1 到 11 个元素,则中位数为 6。 希望这能澄清
,-
numpy.percentile(array,50)
给出中值。 -
numpy.percentile
可以选择指定对nearest
的插值。 - 但是,此函数在
numpy.ma
模块中不可用。 - this answer 中使用的技巧可以在这里使用。
这个想法是用 nan
填充无效值,并使用 numpy.nanpercentile()
和 nearest
插值。
>>> mdata1 = numpy.ma.filled(mdata.astype('float'),numpy.nan)
>>> numpy.nanpercentile(mdata1,50,axis=0,interpolation='nearest')
array([5.,1.,2.,3.,4.])