Если вам нравится linspace
и вы предпочитаете однострочники, вы можете сделать:
plt.plot(np.sort(a), np.linspace(0, 1, len(a), endpoint=False))
Учитывая мои вкусы, я почти всегда делаю:
# a is the data array
x = np.sort(a)
y = np.arange(len(x))/float(len(x))
plt.plot(x, y)
Что работает для менядаже если есть >O(1e6)
значений данных.Если вам действительно нужно уменьшить выборку, я бы установил
x = np.sort(a)[::down_sampling_step]
Редактировать , чтобы ответить на комментарий / редактировать, почему я использую endpoint=False
или y
, как определено выше.Ниже приведены некоторые технические детали.
Эмпирический CDF обычно формально определяется как
CDF(x) = "number of samples <= x"/"number of samples"
, чтобы точно соответствовать этому формальному определению, вам нужно будет использовать y = np.arange(1,len(x)+1)/float(len(x))
, чтобы мы получилиy = [1/N, 2/N ... 1]
.Эта оценка является объективной оценкой, которая будет сходиться к истинному CDF в пределе бесконечных выборок Ссылка на Википедию .
Я склонен использовать y = [0, 1/N, 2/N ... (N-1)/N]
, поскольку (а) легчеcode / more idomatic, (b), но все еще формально оправдано, поскольку можно всегда поменять CDF(x)
на 1-CDF(x)
в доказательстве сходимости, и (c) работает с (простым) методом понижающей дискретизации, описанным выше.
В некоторых частных случаях полезно определить
y = (arange(len(x))+0.5)/len(x)
, который является промежуточным между этими двумя соглашениями.Который, по сути, говорит, что «есть вероятность 1/(2N)
значения меньше, чем наименьшее значение, которое я видел в моей выборке, и 1/(2N)
шанс значения больше, чем наибольшее значение, которое я видел до сих пор»..
Однако для больших выборок и разумных распределений соглашение, приведенное в основной части ответа, легко написать, является объективной оценкой истинного CDF и работает с методологией понижающей дискретизации.