为每一步生成两种概率相同的随机变量

Generate two kinds of random variables for each step with same probabilities

目标:制作两种泊松随机变量(λ=30, 60)

条件:

  1. 我们有一个用以下代码制作的数组(np.random.binomial(n=1, p=1/2, size=1000))
  2. 如果数组中的数是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 函数中执行。