Вопрос
Я хочу создать данные для моделирования. Основано на следующих логах c:
Ввод : 2 numpy массив с именами z
и d
.
z
: массив 1d, значение 0/1
d
: массив 1d, значение 0/1
Возврат: y
: 1d массив. значение: норма случайных чисел.
Если z == 0 и d == 0, y ~ норма (1,1),
, если z == 0 и d == 1, y ~ норма (0,1),
, если z == 1 и d == 0, y ~ норма (1,1),
, если z == 1 и d == 1 , у ~ норма (2,1).
Я хочу сделать это очень быстро, ясно и pythoni c.
Кажется основ 1083 * математика и np.where
быстрее. В этом случае у меня есть только 3 условия (вы можете ясно видеть из части математики basi c). Если у меня есть 10 или более условий, введите их в if-else
утверждение иногда сбивает с толку. Я хочу выполнить моделирование данных, что означает, что я буду генерировать данные в миллионы раз с разными значениями n
. Итак, как лучше это сделать?
Что я пробовал:
# generate data
n = 2000
z = np.random.binomial(1,0.5,n)
d = np.random.binomial(1,0.5,n)
случай, когда
def myfun(x):
return {(0,1):np.random.normal(0,1),\
(0,0):np.random.normal(1,1),\
(1,0):np.random.normal(1,1),\
(1,1):np.random.normal(2,1)}[x]
%%timeit
y = [myfun(i) for i in zip(z,d)]
Out:
16,2 мс ± 139 мкс на л oop (среднее ± стандартное отклонение из 7 прогонов, 100 циклов каждый)
простой if-else
%%timeit
y = np.random.normal([0 if (i == 0) & (j ==1) else 2 if (i == 1) & (j == 1) else 1 for i,j in zip(z,d)],1)
Out:
1,38 мс ± 22,1 мкс на л oop (среднее ± стандартное отклонение. Девять прогонов, 1000 циклов в каждом)
основы c математика
%%timeit
h0 = np.random.normal(0,1,n)
h1 = np.random.normal(1,1,n)
h2 = np.random.normal(2,1,n)
y = (1-z)*d*h0 + (1-d)*h1 + z*d*h2
Out:
140 мкс ± 135 нс на l oop (среднее ± стандартное отклонение из 7 прогонов, 10000 петель каждый)
np.where
%%timeit
h0 = np.random.normal(0,1,n)
h1 = np.random.normal(1,1,n)
h2 = np.random.normal(2,1,n)
y = np.where((d== 0),h1,0) + np.where((z ==1) & (d== 1),h2,0) + np.where((z ==0) & (d== 1),h0,0)
Out:
156 мкс ± 598 нс на л oop (среднее ± стандартное отклонение из 7 прогонов, по 10000 циклов в каждом)
Есть ли другой новый метод?