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