【发布时间】:2020-01-10 05:50:24
【问题描述】:
问题
我想生成要建模的数据。基于以下逻辑:
输入:2个名为z和d的numpy数组。
z:一维数组,值 0/1
d:一维数组,值 0/1
返回:
y:一维数组。 value:范数随机数。
如果 z == 0 且 d==0, y ~ norm(1,1),
如果 z == 0 且 d == 1, y~ norm(0,1),
如果 z == 1 且 d == 0, y ~ norm(1,1),
如果 z == 1 且 d == 1,则 y ~ norm(2,1)。
我想以一种超级快速、清晰和 Pythonic 的方式来完成。
似乎基础数学和np.where 更快。在这种情况下,我只有 3 个条件(你可以从基础数学部分看得很清楚)。如果我有 10 个或更多条件,在 if-else 中键入它们有时会令人困惑。我想进行数据模拟,这意味着我将在不同的n生成数百万次数据。那么,最好的方法是什么?
我尝试过的:
# generate data
n = 2000
z = np.random.binomial(1,0.5,n)
d = np.random.binomial(1,0.5,n)
dict case-when
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)]
输出:
每个循环 16.2 ms ± 139 µs(平均值 ± 标准偏差,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)
输出:
每个循环 1.38 ms ± 22.1 µs(7 次运行的平均值 ± 标准偏差,每次 1000 个循环)
基础数学
%%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
输出:
每个循环 140 µs ± 135 ns(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)
输出:
每个循环 156 µs ± 598 ns(7 次运行的平均值 ± 标准偏差,每次 10000 次循环)
还有其他新方法吗?
【问题讨论】:
-
我确定您的
if-else不会做您认为的事情,因此请确保您的所有选项都先做同样的事情。 -
@AndrasDeak 抱歉,修改了我的帖子
-
更好,但你也应该仔细看看
i == 0 & j ==1。
标签: python numpy if-statement