Базовые решения Numpy и Pandas
Нет полностью упакованного метода (в Numpy), но есть много однотипных лайнеров.Вот как это сделать, используя сравнение и логические операции ( Редактировать подсказку Полу Панцеру за предложение использовать np.count_nonzero
):
import numpy as np
arr = np.linspace(-15,15,1000)
np.count_nonzero((arr > -10) & (arr < 10))/arr.size
Вывод:
0.666
Если вы хотите использовать Pandas, метод pandas.Series.between
немного приблизит вас к необходимому пакету:
import pandas as pd
sr = pd.Series(np.linspace(-15,15,1000))
np.count_nonzero(sr.between(-10,10))/sr.size
Вывод:
0.666
Подводные камни
Каждый метод анализа интервалов включает в себя явное или неявное определение рассматриваемого интервала.Является ли интервал закрытым (т.е. включает в себя экстремальные значения) на обоих концах, как [-10, 10]
?Или это полуоткрытое (то есть исключает крайнее значение на одном конце), как [-10, 10)
?И т. Д.
Это, как правило, не является проблемой при работе с массивами float
значений, взятых из данных (поскольку маловероятно, что какие-либо данные попадают именно в крайности), но может вызвать серьезные проблемы, когдаработа с массивами int
.Например, два перечисленных выше метода могут давать разные результаты, если массив содержит граничные значения интервала:
arr = np.arange(-15,16)
print(np.count_nonzero((arr > -10) & (arr < 10))/arr.size)
print(np.count_nonzero(pd.Series(arr).between(-10,10))/arr.size)
Выходные данные:
0.6129032258064516
0.6774193548387096
По умолчанию используется метод pd.Series.between
к закрытому интервалу на обоих концах, поэтому для сопоставления с ним в Numpy вам придется использовать операторы инклюзивного сравнения:
arr = np.arange(-15,16)
print(np.count_nonzero((arr >= -10) & (arr <= 10))/arr.size)
print(np.count_nonzero(pd.Series(arr).between(-10,10))/arr.size)
Вывод:
0.6774193548387096
0.6774193548387096
Все это дляскажем: когда вы выбираете метод для этого вида интервального анализа, помните о его границах и применяйте согласованные соглашения во всех связанных анализах.
Другие решения
Если вы предполагаетеданные сортируются (или если вы сортируете их самостоятельно), вы можете использовать np.searchsorted
:
arr = np.random.uniform(-15,15,100)
arr.sort()
np.diff(arr.searchsorted([-10, 10]))[0]/arr.size
Вывод:
0.65