Да, эту операцию можно выполнять без цикла.Попробуйте:
import numpy as np
from scipy import stats
sample_size = 100
p = 0.25
# Flip a coin with P(HEADS) = p to determine which distribution to draw from
indicators = stats.bernoulli.rvs(p, size=sample_size)
# Draw from N(0, 1) w/ probability p and N(-1, 1) w/ probability (1-p)
draws = (indicators == 1) * np.random.normal(0, 1, size=sample_size) + \
(indicators == 0) * np.random.normal(-1, 1, size=sample_size)
Вы можете сделать то же самое, используя np.vectorize
( caveat emptor ) :
def draw(x):
if x == 0:
return np.random.normal(-1, 1)
elif x == 1:
return np.random.normal(0, 1)
draw_vec = np.vectorize(draw)
draws = draw_vec(indicators)
Если вам нужно расширить решение на смесь из более чем двух распределений, вы можете использовать np.random.multinomial
, чтобы назначить выборки для распределений и добавить дополнительные случаи в if/else
в draw
.