Без использования SciPy и дал численную выборку вашей PDF, вы можете попробовать с помощью кумулятивного распределения и линейной интерполяции. В приведенном ниже коде предполагается равное расстояние в x. Он может быть изменен для интеграции для произвольно отбираемого PDF-файла. Обратите внимание, что он перенормирует PDF в 1 в диапазоне от x.
import numpy as np
def randdist(x, pdf, nvals):
"""Produce nvals random samples from pdf(x), assuming constant spacing in x."""
# get cumulative distribution from 0 to 1
cumpdf = np.cumsum(pdf)
cumpdf *= 1/cumpdf[-1]
# input random values
randv = np.random.uniform(size=nvals)
# find where random values would go
idx1 = np.searchsorted(cumpdf, randv)
# get previous value, avoiding division by zero below
idx0 = np.where(idx1==0, 0, idx1-1)
idx1[idx0==0] = 1
# do linear interpolation in x
frac1 = (randv - cumpdf[idx0])/(cumpdf[idx1] - cumpdf[idx0])
randdist = x[idx0]*(1-frac1) + x[idx1]*frac1
return randdist
Сэмплирование из произвольного распределения может быть выполнено путем выборочного измерения равномерно в [0, 1], а затем с использованием обратной функции кумулятивной плотности. Если вы не можете вычислить этот обратный-cdf аналитически, вы можете использовать численное интегрирование своего pdf (например, используя правило трапеции) и сохранить значения в списке; то вы можете выполнить двоичный поиск вашего образца [0, 1], чтобы найти образец вашего pdf. –
@FrancisColas, это типичный способ решить мою задачу. Но действительно ли это, что я могу решить свою проблему, используя классический способ, когда есть такой мощный инструмент, как scipy? – Denis
Ну, я не знаю какого-либо конкретного способа использования numpy/scipy. Но обратите внимание, что это просто комментарий, чтобы дать вам подсказку для решения, другие могут отправлять более удовлетворительные ответы. –