如何在具有偶数个条目的numpy掩码数组中获得单个中位数

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)

如您所见,它正在求平均值(16)并提供分数值 (3.5)。我想要 16 中的任何一个。

对于偶数个元素,中位数returns中间两个数的平均值。但是,如果您不想要平均值,只想要两个中间数字中的任何一个,您可以 从集合中删除一个元素 同时调用 median 方法,这将使集合的长度奇怪,你会得到你想要的,而不是平均值(虽然这不是找到中位数的正确方法

当你有偶数个元素时,预计会平均。 假设您有从 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.])