如何在蒙板数组上运行numpy函数percentile()?

时间:2016-06-21 05:03:49

标签: python arrays numpy

我尝试从具有NoData值的数组中检索百分位数。在我的例子中,Nodata值由-3.40282347e + 38表示。我认为蒙版数组会从进一步的计算中排除这些值。我成功创建了蒙版数组但是对于np.percentile()函数,蒙版没有效果。

>>> DataArray = np.array(data)
>>> DataArray

([[ value, value...]], dtype=float32)

>>> masked_data = ma.masked_where(DataArray < 0, DataArray)
>>> p5 = np.percentile(masked_data, 5)
>>> print p5

 -3.40282347e+38

2 个答案:

答案 0 :(得分:3)

查看np.percentile代码,很明显它对掩码数组没有什么特别之处。

def percentile(a, q, axis=None, out=None,
               overwrite_input=False, interpolation='linear', keepdims=False):
    q = array(q, dtype=np.float64, copy=True)
    r, k = _ureduce(a, func=_percentile, q=q, axis=axis, out=out,
                    overwrite_input=overwrite_input,
                    interpolation=interpolation)
    if keepdims:
        if q.ndim == 0:
            return r.reshape(k)
        else:
            return r.reshape([len(q)] + k)
    else:
        return r

_ureduce_percentilenumpy/lib/function_base.py中定义的内部函数。所以实际行动更复杂。

屏蔽数组有两种使用numpy函数的策略。一个是fill - 用无害的值替换被屏蔽的值,例如在执行求和时为0,在执行产品时为1。另一个是compress数据 - 也就是说,删除所有屏蔽的值。

例如:

In [997]: data=np.arange(-5,10)
In [998]: mdata=np.ma.masked_where(data<0,data)

In [1001]: np.ma.filled(mdata,0)
Out[1001]: array([0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [1002]: np.ma.filled(mdata,1)
Out[1002]: array([1, 1, 1, 1, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [1008]: mdata.compressed()
Out[1008]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

哪个会为您提供所需的percentile?填充还是压缩?或者没有。您需要充分了解百分位数的概念,以了解它应如何应用于屏蔽值。

答案 1 :(得分:3)

如果您将屏蔽值填充为np.nan,则可以使用np.nanpercentile

import numpy as np
data = np.arange(-5.5,10.5) # Note that you need a non-integer array to store NaN
mdata = np.ma.masked_where(data < 0, data)
mdata = np.ma.filled(mdata, np.nan)
np.nanpercentile(mdata, 50) # 50th percentile