2016-06-21 2 views
3

Я пытаюсь получить процентили из массива с значениями NoData. В моем случае значения Nodata представлены -3.40282347e + 38. Я думал, что маскированный массив исключит эти значения из дальнейших вычислений. Я успешно создаю маскированный массив, но для функции np.percentile() маска не действует.Как запустить функцию numacity() для маскирования массива?

>>> 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 
+0

наилучшим образом использовать замаскированные методы или функции np.ma. Многие функции np делегируют методам, но не рассчитывают на это. – hpaulj

ответ

2

Глядя на 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 и _percentile внутренние функции, определенные в numpy/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? Заполнение или сжатие? Или нет. Вам нужно понять концепцию процентиля достаточно хорошо, чтобы знать, как он должен применяться в случае ваших замаскированных значений.

+0

Сжатый() сделал трюк для меня. Поскольку мне нужно было полностью исключить значения NoData до вычисления процентиля. – EikeMike

2

Если вы заполняете свои замаскированные значения, как 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 
Смежные вопросы