为每一步生成两种概率相同的随机变量
Generate two kinds of random variables for each step with same probabilities
目标:制作两种泊松随机变量(λ=30, 60)
条件:
- 我们有一个用以下代码制作的数组(np.random.binomial(n=1, p=1/2, size=1000))
- 如果数组中的数是1,那么我们做一个泊松随机变量(λ=30)
否则我们做一个泊松随机变量(λ=60)
所以我写了这样的代码
import numpy as np
a = np.random.binomial(n=1, p=1/2, size=1000)
b = np.where(a==1, np.random.poisson(lam=30), np.random.poisson(lam=60))
print(b)
但是结果是这样的
[62 62 28 ... 28 28 62]
不断创建固定随机变量。
那么如何得到随机变量不固定的结果呢?
(我不想使用循环(for 或 while))
这里的问题是 np.where
中的参数在调用之前被评估,所以它和你写
完全一样
value1 = np.random.poisson(lam=30)
value2 = np.random.poisson(lam=60)
b = np.where(a==1, value1, value2)
使用 for 循环是一个很好的解决方案,但如果您不想这样做,可以尝试使用 np.vectorize
def poisson(x):
return np.random.poisson(lam=30) if x == 1 else np.random.poisson(lam=60)
b = np.vectorize(poisson)(a)
例如应该有效。
@BlackRaven 的回答很好,但是 np.vectorize
的使用在“幕后”使用了 Python 循环,因此效率不高。另一种方法是使用 a
创建 lambda 值的 vector(即一维 NumPy 数组)以传递给 poisson()
,就像这样(注意我已切换到更新的 NumPy 随机接口):
rng = np.random.default_rng()
a = rng.binomial(n=1, p=1/2, size=1000) # array containing 0 and 1
lam = 30 + (1-a)*30 # array containing 30 and 60
b = rng.poisson(lam=lam) # mixture of Poisson samples
当然,您不必创建命名变量来保存 lambda 值:
rng = np.random.default_rng()
a = rng.binomial(n=1, p=1/2, size=1000) # array containing 0 and 1
b = rng.poisson(lam=30 + (1-a)*30) # mixture of Poisson samples
所有涉及的循环现在都在用 C 语言实现的 NumPy 函数中执行。
目标:制作两种泊松随机变量(λ=30, 60)
条件:
- 我们有一个用以下代码制作的数组(np.random.binomial(n=1, p=1/2, size=1000))
- 如果数组中的数是1,那么我们做一个泊松随机变量(λ=30) 否则我们做一个泊松随机变量(λ=60)
所以我写了这样的代码
import numpy as np
a = np.random.binomial(n=1, p=1/2, size=1000)
b = np.where(a==1, np.random.poisson(lam=30), np.random.poisson(lam=60))
print(b)
但是结果是这样的
[62 62 28 ... 28 28 62]
不断创建固定随机变量。
那么如何得到随机变量不固定的结果呢? (我不想使用循环(for 或 while))
这里的问题是 np.where
中的参数在调用之前被评估,所以它和你写
value1 = np.random.poisson(lam=30)
value2 = np.random.poisson(lam=60)
b = np.where(a==1, value1, value2)
使用 for 循环是一个很好的解决方案,但如果您不想这样做,可以尝试使用 np.vectorize
def poisson(x):
return np.random.poisson(lam=30) if x == 1 else np.random.poisson(lam=60)
b = np.vectorize(poisson)(a)
例如应该有效。
@BlackRaven 的回答很好,但是 np.vectorize
的使用在“幕后”使用了 Python 循环,因此效率不高。另一种方法是使用 a
创建 lambda 值的 vector(即一维 NumPy 数组)以传递给 poisson()
,就像这样(注意我已切换到更新的 NumPy 随机接口):
rng = np.random.default_rng()
a = rng.binomial(n=1, p=1/2, size=1000) # array containing 0 and 1
lam = 30 + (1-a)*30 # array containing 30 and 60
b = rng.poisson(lam=lam) # mixture of Poisson samples
当然,您不必创建命名变量来保存 lambda 值:
rng = np.random.default_rng()
a = rng.binomial(n=1, p=1/2, size=1000) # array containing 0 and 1
b = rng.poisson(lam=30 + (1-a)*30) # mixture of Poisson samples
所有涉及的循环现在都在用 C 语言实现的 NumPy 函数中执行。