[英]How to get single median in numpy masked array with even number of entires
我有一个 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, 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
模块中不可用。 这个想法是用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.])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.