numpy.percentile
- numpy.percentile(a, q, axis=None, out=None, overwrite_input=False, method='linear', keepdims=False, *, weights=None, interpolation=None)[source]
-
Вычисление q-го процентиля данных по указанной оси.
Возвращает q-й процентиль(и) элементов массива.
- Параметры:
-
- aarray_like вещественных чисел
-
Входной массив или объект, который может быть преобразован в массив.
- qarray_like float
-
Процент или последовательность процентов для вычисления процентилей. Значения должны быть в диапазоне от 0 до 100 включительно.
- axis{int, кортеж из int, None}, необязательно
-
Ось или оси, по которым вычисляются процентили. По умолчанию процентиль(и) вычисляются по сглаженному варианту массива.
Изменено в версии 1.9.0: Поддерживается кортеж осей
- outndarray, необязательно
-
Альтернативный выходной массив, в который поместить результат. Он должен иметь ту же форму и длину буфера, что и ожидаемый результат, но тип (результата) будет преобразован при необходимости.
- overwrite_inputbool, необязательно
-
Если True, то разрешить изменение входного массива
aпромежуточными вычислениями, чтобы сохранить память. В этом случае содержимое входногоaпосле завершения этой функции не определено. - methodstr, необязательно
-
Этот параметр указывает метод для оценки процентиля. Существует множество различных методов, некоторые уникальны для NumPy. См. примечания для объяснения. Доступные варианты, отсортированные по типу R, как суммируется в статье H&F [1]:
- ‘inverted_cdf’
- ‘averaged_inverted_cdf’
- ‘closest_observation’
- ‘interpolated_inverted_cdf’
- ‘hazen’
- ‘weibull’
- ‘linear’ (по умолчанию)
- ‘median_unbiased’
- ‘normal_unbiased’
Первые три метода являются разрывными. NumPy дополнительно определяет следующие разрывные варианты по умолчанию ‘linear’ (7.):
- ‘lower’
- ‘higher’,
- ‘midpoint’
- ‘nearest’
Изменено в версии 1.22.0: Этот аргумент ранее назывался «интерполяция» и предлагал только «линейный» по умолчанию и последние четыре варианта.
- keepdimsbool, необязательно
-
Если это True, оси, которые были уменьшены, остаются в результате как размеры с размером один. С этим параметром результат будет корректно транслироваться относительно исходного массива
a.Новое в версии 1.9.0.
- weightsarray_like, необязательно
-
Массив весов, связанных со значениями в
a. Каждое значение вaвносит вклад в процентиль в соответствии со своим связанным весом. Массив весов может быть одномерным (в этом случае его длина должна быть размеромaпо заданной оси) или иметь ту же форму, что иa. Еслиweights=None, то все данные вaпредполагаются с весом, равным единице. Толькоmethod=”inverted_cdf”поддерживает веса. См. примечания для более подробной информации.Новое в версии 2.0.0.
- interpolationstr, необязательно
-
Устаревшее имя для ключевого аргумента method.
Устарело начиная с версии 1.22.0.
- Возвращает:
-
- percentileскаляр или ndarray
-
Если
q— единственный процентиль иaxis=None, то результат — скаляр. Если задано несколько процентилей, первая ось результата соответствует процентилям. Другие оси — это оси, оставшиеся после сокращенияa. Если вход содержит целые числа или числа с плавающей точкой меньшеfloat64, тип данных выходных данных —float64. В противном случае тип данных результата такой же, как у входных данных. Еслиoutзадан, возвращается этот массив.
См. также
meanmedian-
эквивалентно
percentile(..., 50) nanpercentilequantile-
эквивалентно percentile, за исключением того, что q в диапазоне [0, 1].
Примечания
В общем случае процентиль на уровне процента \(q\) кумулятивной функции распределения \(F(y)=P(Y \leq y)\) с мерой вероятности \(P\) определяется как любое число \(x\), которое удовлетворяет условиям покрытия
\[P(Y < x) \leq q/100 \quad\text{and} \quad P(Y \leq x) \geq q/100\]с случайной переменной \(Y\sim P\). Выборочные процентили, результат
percentile, обеспечивают непараметрическую оценку соответствующих характеристик генеральной совокупности, представленных неизвестной \(F\), по данному вектору данныхaдлинойn.Один тип оценок возникает, когда \(F\) рассматривается как эмпирическая функция распределения данных, т.е. \(F(y) = \frac{1}{n} \sum_i 1_{a_i \leq y}\). Затем различные методы соответствуют различным вариантам \(x\), которые удовлетворяют вышеприведенным неравенствам. Методы, которые следуют этому подходу, это
inverted_cdfиaveraged_inverted_cdf.Более общий способ определения выборочных оценок процентилей следующий. Эмпирический q-процентиль
a- этоn * q/100-е значение от минимального до максимального в отсортированной копииa. Значения и расстояния двух ближайших соседей, а также параметрmethodопределяют процентиль, если нормализованный ранг не соответствует точно местоположениюn * q/100. Эта функция аналогична медиане, еслиq=50, аналогична минимуму, еслиq=0и аналогична максимуму, еслиq=100.Необязательный параметр
methodопределяет метод, используемый, когда искомый процентиль находится между двумя индексамиiиj = i + 1. В этом случае мы сначала определяемi + g, виртуальный индекс, который находится междуiиj, гдеi- целая часть, аg- дробная часть индекса. Тогда окончательный результат представляет собой интерполяциюa[i]иa[j]на основеg. При вычисленииg,iиjизменяются с использованием поправочных константalphaиbeta, выбор которых зависит от используемогоmethod. Наконец, обратите внимание, что поскольку Python использует нумерацию с нуля, код вычитает еще 1 из индекса внутри.Следующая формула определяет виртуальный индекс
i + g, местоположение процентиля в отсортированной выборке:\[i + g = (q / 100) * ( n - alpha - beta + 1 ) + alpha\]Затем разные методы работают следующим образом
- inverted_cdf:
-
метод 1 из H&F [1]. Этот метод даёт разрывные результаты:
- если g > 0; то взять j
- если g = 0; то взять i
- averaged_inverted_cdf:
-
метод 2 из H&F [1]. Этот метод даёт разрывные результаты:
- если g > 0; то взять j
- если g = 0; то взять среднее значение между границами
- closest_observation:
-
метод 3 из H&F [1]. Этот метод даёт разрывные результаты:
- если g > 0; то взять j
- если g = 0 и индекс нечётный; то взять j
- если g = 0 и индекс чётный; то взять i
- interpolated_inverted_cdf:
-
метод 4 из H&F [1]. Этот метод даёт непрерывные результаты, используя:
- alpha = 0
- beta = 1
- hazen:
-
метод 5 из H&F [1]. Этот метод даёт непрерывные результаты, используя:
- alpha = 1/2
- beta = 1/2
- weibull:
-
метод 6 из H&F [1]. Этот метод даёт непрерывные результаты, используя:
- alpha = 0
- beta = 0
- linear:
-
метод 7 из H&F [1]. Этот метод даёт непрерывные результаты, используя:
- alpha = 1
- beta = 1
- median_unbiased:
-
метод 8 из H&F [1]. Этот метод, вероятно, лучший, если функция распределения выборки неизвестна (см. ссылку). Этот метод даёт непрерывные результаты, используя:
- alpha = 1/3
- beta = 1/3
- normal_unbiased:
-
метод 9 из H&F [1]. Этот метод, вероятно, лучший, если известно, что функция распределения выборки является нормальной. Этот метод даёт непрерывные результаты, используя:
- alpha = 3/8
- beta = 3/8
- lower:
-
Метод NumPy, сохранённый для обратной совместимости. Принимает
iв качестве точки интерполяции. - higher:
-
Метод NumPy, сохранённый для обратной совместимости. Принимает
jв качестве точки интерполяции. - nearest:
-
Метод NumPy, сохранённый для обратной совместимости. Принимает
iилиj, какой из них ближе. - midpoint:
-
Метод NumPy, сохранённый для обратной совместимости. Использует
(i + j) / 2.
Для взвешенных перцентилей вышеуказанные условия покрытия остаются в силе. Эмпирическая кумулятивная функция распределения просто заменяется её взвешенной версией, т.е. \(P(Y \leq t) = \frac{1}{\sum_i w_i} \sum_i w_i 1_{x_i \leq t}\). Только
method="inverted_cdf"поддерживает веса.Список литературы
Примеры
>>> a = np.array([[10, 7, 4], [3, 2, 1]]) >>> a array([[10, 7, 4], [ 3, 2, 1]]) >>> np.percentile(a, 50) 3.5 >>> np.percentile(a, 50, axis=0) array([6.5, 4.5, 2.5]) >>> np.percentile(a, 50, axis=1) array([7., 2.]) >>> np.percentile(a, 50, axis=1, keepdims=True) array([[7.], [2.]])>>> m = np.percentile(a, 50, axis=0) >>> out = np.zeros_like(m) >>> np.percentile(a, 50, axis=0, out=out) array([6.5, 4.5, 2.5]) >>> m array([6.5, 4.5, 2.5])
>>> b = a.copy() >>> np.percentile(b, 50, axis=1, overwrite_input=True) array([7., 2.]) >>> assert not np.all(a == b)
Различные методы можно визуализировать графически:
import matplotlib.pyplot as plt a = np.arange(4) p = np.linspace(0, 100, 6001) ax = plt.gca() lines = [ ('linear', '-', 'C0'), ('inverted_cdf', ':', 'C1'), # Almost the same as `inverted_cdf`: ('averaged_inverted_cdf', '-.', 'C1'), ('closest_observation', ':', 'C2'), ('interpolated_inverted_cdf', '--', 'C1'), ('hazen', '--', 'C3'), ('weibull', '-.', 'C4'), ('median_unbiased', '--', 'C5'), ('normal_unbiased', '-.', 'C6'), ] for method, style, color in lines: ax.plot( p, np.percentile(a, p, method=method), label=method, linestyle=style, color=color) ax.set( title='Percentiles for different methods and data: ' + str(a), xlabel='Percentile', ylabel='Estimated percentile value', yticks=a) ax.legend(bbox_to_anchor=(1.03, 1)) plt.tight_layout() plt.show()
© 2005–2024 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/2.0/reference/generated/numpy.percentile.html