温州市护送信息网

NumPy random.choice()函数的使用小结

2026-03-25 19:09:03 浏览次数:0
详细信息

np.random.choice() 是 NumPy 中用于随机抽样的核心函数,功能强大且灵活。以下是对其用法的小结:

一、基本语法

np.random.choice(a, size=None, replace=True, p=None)

参数说明:

二、基础用法示例

1. 从整数范围抽样

import numpy as np

# 从 0-4 中随机选一个数
np.random.choice(5)                     # 可能输出:3

# 从 0-9 中选3个(有放回)
np.random.choice(10, size=3)            # 可能输出:[7, 2, 7]

# 从 0-9 中选3个(无放回)
np.random.choice(10, size=3, replace=False)  # 可能输出:[9, 0, 4]

2. 从数组抽样

arr = ['a', 'b', 'c', 'd', 'e']

# 随机选择一个元素
np.random.choice(arr)                  # 可能输出:'c'

# 选择多个(可重复)
np.random.choice(arr, size=5)          # 可能输出:['a','e','d','a','c']

# 选择多个(不重复)
np.random.choice(arr, size=3, replace=False)  # 可能输出:['b','d','e']

三、高级用法

1. 指定概率分布

# 按指定概率抽样
np.random.choice(['A', 'B', 'C'], 
                 size=10, 
                 p=[0.1, 0.3, 0.6])  # A:10%, B:30%, C:60%
# 可能输出:['C','B','C','C','B','C','A','C','B','C']

2. 多维输出

# 生成 3x2 的随机矩阵
np.random.choice(10, size=(3, 2))  
# 可能输出:[[5, 1],
#           [9, 3],
#           [7, 0]]

3. 无放回抽样验证

# 无放回时,size 不能超过 a 的长度
np.random.choice(5, size=5, replace=False)  # 正确:随机排列
# 可能输出:[4, 0, 2, 1, 3]

# np.random.choice(5, size=6, replace=False)  # 错误!会报错

四、注意事项

概率归一化p 参数会自动归一化,但建议自行保证 sum(p)=1

# 以下两种方式等价
np.random.choice([1, 2, 3], p=[0.2, 0.3, 0.5])
np.random.choice([1, 2, 3], p=[2, 3, 5])  # 自动归一化为 0.2,0.3,0.5

随机种子:为结果可重现,可设置随机种子

np.random.seed(42)
np.random.choice(10, size=3)  # 总是得到 [6, 3, 7]

新版随机数 API(推荐):

# NumPy 1.17+ 推荐使用新 API
rng = np.random.default_rng(seed=42)
rng.choice(5, size=3)  # 更快的随机数生成器

五、实际应用场景

1. 模拟掷骰子

# 投掷 1000 次公平骰子
rolls = np.random.choice([1,2,3,4,5,6], size=1000)

# 投掷 1000 次不公平骰子(6点概率50%)
biased_rolls = np.random.choice([1,2,3,4,5,6], 
                                size=1000, 
                                p=[0.1,0.1,0.1,0.1,0.1,0.5])

2. 自助法(Bootstrap)抽样

data = np.array([1.2, 2.5, 3.1, 4.8, 5.3])
bootstrap_sample = np.random.choice(data, size=len(data), replace=True)

3. 随机划分数据集

data = np.arange(100)
train_idx = np.random.choice(100, size=80, replace=False)  # 80个训练索引
test_idx = np.setdiff1d(np.arange(100), train_idx)          # 剩余20个测试

六、与 random.choices() 对比(Python标准库)

特性 np.random.choice() random.choices() (Python 3.6+)
返回类型 NumPy 数组 Python 列表
多维输出 支持(size参数) 不支持
性能 更快(向量化) 较慢
无放回抽样 replace=False random.sample()
权重参数 p weights
# Python 标准库 equivalent
import random
random.choices(['a','b','c'], k=5, weights=[0.1,0.3,0.6])

掌握 np.random.choice() 可以有效替代许多需要循环实现的随机抽样场景,提高代码效率和可读性。

相关推荐