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

问题描述

我有一个 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)

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

解决方法

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

,

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...