NumPy random.choice() 函数详解
在数据分析、模拟实验和机器学习中,随机采样 是一个非常常见的操作。
NumPy 提供的 numpy.random.choice()
函数让我们可以方便地从数组或序列中随机选取元素。
本文将深入介绍 numpy.random.choice()
的功能、参数、注意事项以及常见实战案例。
文章目录
- 一、函数简介
- 二、参数详解
- 三、基础用法示例
- 示例 1:从整数范围中随机选取
- 示例 2:从列表中随机抽样
- 示例 3:一次抽取多个样本
- 示例 4:无放回抽样(不重复)
- 四、加权抽样(设置概率分布)
- 示例 5:指定抽样概率
- 五、生成多维随机数组
- 示例 6:生成二维随机数组
- 六、注意事项与常见错误
- ❌ 1. 概率和不为 1
- ❌ 2. 无放回抽样数量超限
- ❌ 3. 非一维数组抽样
- 七、实战案例
- 案例 1:模拟掷骰子
- 案例 2:随机抽取样本用于验证集
- 案例 3:加权随机推荐系统
- 八、与其他随机函数的对比
一、函数简介
numpy.random.choice()
用于从给定的一维数组中随机抽取元素,
并可以选择是否允许重复(有放回或无放回抽样)。
函数原型如下:
numpy.random.choice(a, size=None, replace=True, p=None)
官方文档介绍地址numpy.random.choice
二、参数详解
参数 | 说明 | 默认值 |
---|---|---|
a | 如果是整数 n ,则表示从 [0, 1, 2, ..., n-1] 中抽取;如果是数组,则表示从该数组中抽取。 | 必填 |
size | 抽取的样本数量。可以是整数或元组,用于生成多维结果。 | None (即返回单个值) |
replace | 是否允许重复抽取。True 表示有放回抽样,False 表示无放回抽样。 | True |
p | 每个元素被抽取的概率(权重)。长度必须与 a 相同,且和为 1。 | None (即平均概率) |
三、基础用法示例
示例 1:从整数范围中随机选取
import numpy as np# 从 0~9 中随机选择一个数字
num = np.random.choice(10)
print(num)
输出结果示例:
7
说明:
这里 a=10
表示选择范围 [0, 1, 2, ..., 9]
。
示例 2:从列表中随机抽样
fruits = ['apple', 'banana', 'cherry', 'orange']
sample = np.random.choice(fruits)
print(sample)
输出示例:
banana
示例 3:一次抽取多个样本
numbers = np.arange(10)
sample = np.random.choice(numbers, size=5)
print(sample)
输出示例(每次结果不同):
[8 8 0 4 7]
这里8出现两次是因为默认有放回抽样。
示例 4:无放回抽样(不重复)
sample = np.random.choice(numbers, size=5, replace=False)
print(sample)
输出:
[4 2 9 7 6]
✅ 小技巧:当
replace=False
时,size
不能大于a
的长度,否则会报错。
四、加权抽样(设置概率分布)
默认情况下,每个元素被抽取的概率是均匀的。
如果你希望某些元素被抽到的概率更高,可以使用参数 p
。
示例 5:指定抽样概率
items = ['A', 'B', 'C']
prob = [0.7, 0.2, 0.1] # 概率总和必须为 1
samples = np.random.choice(items, size=10, p=prob)
print(samples)
可能输出:
['A' 'A' 'B' 'A' 'C' 'A' 'A' 'B' 'A' 'A']
💡 实际中常用于模拟随机事件或构建概率分布模型。
五、生成多维随机数组
size
参数可以指定为一个元组,用于生成多维结果。
示例 6:生成二维随机数组
result = np.random.choice(5, size=(2, 3))
print(result)
输出示例:
[[2 1 4][3 0 1]]
这在深度学习、图像随机采样或批量数据构造中非常有用。
六、注意事项与常见错误
❌ 1. 概率和不为 1
np.random.choice([1, 2, 3], p=[0.5, 0.5, 0.2])
# ValueError: probabilities do not sum to 1
必须保证:
sum(p) == 1
❌ 2. 无放回抽样数量超限
np.random.choice(5, size=10, replace=False)
# ValueError: Cannot take a larger sample than population when 'replace=False'
解决方案:要么允许重复(replace=True
),要么减小 size
。
❌ 3. 非一维数组抽样
a
必须是一维数组,若是多维数组则需先展平:
matrix = np.arange(9).reshape(3, 3)
choice = np.random.choice(matrix.flatten(), size=4)
print(choice)
七、实战案例
案例 1:模拟掷骰子
dice = [1, 2, 3, 4, 5, 6]
rolls = np.random.choice(dice, size=10, replace=True)
print("掷骰结果:", rolls)
案例 2:随机抽取样本用于验证集
data = np.arange(100)
test_idx = np.random.choice(data, size=20, replace=False)
print("测试集索引:", test_idx)
案例 3:加权随机推荐系统
users = ["新用户", "普通用户", "VIP用户"]
weights = [0.6, 0.3, 0.1] # 新用户更容易被推荐
recommend = np.random.choice(users, size=5, p=weights)
print("推荐结果:", recommend)
八、与其他随机函数的对比
函数 | 功能 | 是否支持权重 | 示例 |
---|---|---|---|
np.random.choice() | 从数组随机选取 | ✅ 是 | 离散抽样 |
np.random.randin() | 生成随机整数 | ❌ 否 | 均匀分布 |
np.random.rand() | 生成 0~1 之间的浮点数 | ❌ 否 | 连续分布 |
np.random.randn() | 生成服从正态分布的浮点数 | ❌ 否 | 高斯分布 |