目標:制作兩種泊松隨機變數(λ=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))
uj5u.com熱心網友回復:
這里的問題是引數 innp.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)
例如應該作業。
uj5u.com熱心網友回復:
@BlackRaven 的回答效果很好,但是使用np.vectorize“在幕后”使用 Python 回圈,因此它的效率不高。另一種方法是使用a創建要傳遞給的 lambda 值的向量(即 1-d 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 函式中執行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/456862.html
