使用np.random.choice() 并指定对应于所选数组的概率向量:
>>> import numpy as np
>>> np.random.seed(444)
>>> data = np.random.choice(
... a=[0, 1, 2],
... size=50,
... p=[0.5, 0.3, 0.2]
... )
>>> data
array([2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 2, 2, 0, 1, 0, 0, 0, 0, 2, 1, 0, 1,
1, 1, 0, 2, 1, 1, 2, 1, 1, 0, 0, 0, 0, 2, 0, 1, 0, 2, 0, 2, 2, 2,
1, 1, 1, 0, 0, 1])
>>> np.bincount(data) / len(data) # Proportions
array([0.44, 0.32, 0.24])
随着样本量的增加,经验频率应向您的目标收敛:
>>> a_lot_of_data = np.random.choice(
... a=[0, 1, 2],
... size=500_000,
... p=[0.5, 0.3, 0.2]
... )
>>> np.bincount(a_lot_of_data) / len(a_lot_of_data)
array([0.499716, 0.299602, 0.200682])
正如@WarrenWeckesser 所指出的,如果您已经拥有一维 NumPy 数组或 Pandas 系列,则可以直接将其用作输入,而无需指定 p。 np.random.choice() 的默认值是替换采样 (replace=True),因此通过传递您的原始数据,得到的分布应该接近输入的分布。