NumPy random.choice()函数的使用小结
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、函数简介</a></li><li><a href="#_label1">二、参数详解</a></li><li><a href="#_label2">三、基础用法示例</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_0">示例 1:从整数范围中随机选取</a></li><li><a href="#_lab2_2_1">示例 2:从列表中随机抽样</a></li><li><a href="#_lab2_2_2">示例 3:一次抽取多个样本</a></li><li><a href="#_lab2_2_3">示例 4:无放回抽样(不重复)</a></li></ul><li><a href="#_label3">四、加权抽样(设置概率分布)</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_4">示例 5:指定抽样概率</a></li></ul><li><a href="#_label4">五、生成多维随机数组</a></li><ul class="second_class_ul"><li><a href="#_lab2_4_5">示例 6:生成二维随机数组</a></li></ul><li><a href="#_label5">六、注意事项与常见错误</a></li><ul class="second_class_ul"><li><a href="#_lab2_5_6">❌ 1. 概率和不为 1</a></li><li><a href="#_lab2_5_7">❌ 2. 无放回抽样数量超限</a></li><li><a href="#_lab2_5_8">❌ 3. 非一维数组抽样</a></li></ul><li><a href="#_label6">七、实战案例</a></li><ul class="second_class_ul"><li><a href="#_lab2_6_9">案例 1:模拟掷骰子</a></li><li><a href="#_lab2_6_10">案例 2:随机抽取样本用于验证集</a></li><li><a href="#_lab2_6_11">案例 3:加权随机推荐系统</a></li></ul><li><a href="#_label7">八、与其他随机函数的对比</a></li><ul class="second_class_ul"></ul></ul></div><p>在数据分析、模拟实验和机器学习中,<strong>随机采样</strong> 是一个非常常见的操作。<br />NumPy 提供的 <code>numpy.random.choice()</code> 函数让我们可以方便地从数组或序列中随机选取元素。</p><p>本文将深入介绍 <code>numpy.random.choice()</code> 的功能、参数、注意事项以及常见实战案例。</p>
<p class="maodian"><a name="_label0"></a></p><h2>一、函数简介</h2>
<p><code>numpy.random.choice()</code> 用于<strong>从给定的一维数组中随机抽取元素</strong>,<br />并可以选择是否允许重复(有放回或无放回抽样)。</p>
<p>函数原型如下:</p>
<div class="jb51code"><pre class="brush:py;">numpy.random.choice(a, size=None, replace=True, p=None)
</pre></div>
<p>官方文档介绍地址<a href="https://numpy.org/doc/stable/reference/random/generated/numpy.random.choice.html" rel="external nofollow" target="_blank">numpy.random.choice</a></p>
<p style="text-align:center"><img alt="" height="1044" src="https://img.jbzj.com/file_images/article/202601/2026010611062648.jpg" width="957" /></p>
<p class="maodian"><a name="_label1"></a></p><h2>二、参数详解</h2>
<table><thead><tr><th>参数</th><th>说明</th><th>默认值</th></tr></thead><tbody><tr><td>a</td><td>如果是整数 n,则表示从 中抽取;如果是数组,则表示从该数组中抽取。</td><td>必填</td></tr><tr><td>size</td><td>抽取的样本数量。可以是整数或元组,用于生成多维结果。</td><td>None(即返回单个值)</td></tr><tr><td>replace</td><td>是否允许重复抽取。True表示有放回抽样,False表示无放回抽样。</td><td>True</td></tr><tr><td>p</td><td>每个元素被抽取的概率(权重)。长度必须与 a相同,且和为 1。</td><td>None(即平均概率)</td></tr></tbody></table>
<p class="maodian"><a name="_label2"></a></p><h2>三、基础用法示例</h2>
<p class="maodian"><a name="_lab2_2_0"></a></p><h3>示例 1:从整数范围中随机选取</h3>
<div class="jb51code"><pre class="brush:py;">import numpy as np
# 从 0~9 中随机选择一个数字
num = np.random.choice(10)
print(num)
</pre></div>
<p>输出结果示例:</p>
<blockquote><p>7</p></blockquote>
<p>说明:<br />这里 <code>a=10</code> 表示选择范围 <code></code>。</p>
<p class="maodian"><a name="_lab2_2_1"></a></p><h3>示例 2:从列表中随机抽样</h3>
<div class="jb51code"><pre class="brush:py;">fruits = ['apple', 'banana', 'cherry', 'orange']
sample = np.random.choice(fruits)
print(sample)
</pre></div>
<p>输出示例:</p>
<blockquote><p>banana</p></blockquote>
<p class="maodian"><a name="_lab2_2_2"></a></p><h3>示例 3:一次抽取多个样本</h3>
<div class="jb51code"><pre class="brush:py;">numbers = np.arange(10)
sample = np.random.choice(numbers, size=5)
print(sample)
</pre></div>
<p>输出示例(每次结果不同):</p>
<blockquote><p></p></blockquote>
<p>这里8出现两次是因为默认有放回抽样。</p>
<p class="maodian"><a name="_lab2_2_3"></a></p><h3>示例 4:无放回抽样(不重复)</h3>
<div class="jb51code"><pre class="brush:py;">sample = np.random.choice(numbers, size=5, replace=False)
print(sample)
</pre></div>
<p>输出:</p>
<blockquote><p></p></blockquote>
<blockquote><p>✅ 小技巧:当 replace=False 时,size 不能大于 a 的长度,否则会报错。</p></blockquote>
<p class="maodian"><a name="_label3"></a></p><h2>四、加权抽样(设置概率分布)</h2>
<p>默认情况下,每个元素被抽取的概率是<strong>均匀的</strong>。<br />如果你希望某些元素被抽到的概率更高,可以使用参数 <code>p</code>。</p>
<p class="maodian"><a name="_lab2_3_4"></a></p><h3>示例 5:指定抽样概率</h3>
<div class="jb51code"><pre class="brush:py;">items = ['A', 'B', 'C']
prob = # 概率总和必须为 1
samples = np.random.choice(items, size=10, p=prob)
print(samples)
</pre></div>
<p>可能输出:</p>
<blockquote><p>['A' 'A' 'B' 'A' 'C' 'A' 'A' 'B' 'A' 'A']</p></blockquote>
<blockquote><p>💡 实际中常用于<strong>模拟随机事件</strong>或<strong>构建概率分布模型</strong>。</p></blockquote>
<p class="maodian"><a name="_label4"></a></p><h2>五、生成多维随机数组</h2>
<p><code>size</code> 参数可以指定为一个元组,用于生成多维结果。</p>
<p class="maodian"><a name="_lab2_4_5"></a></p><h3>示例 6:生成二维随机数组</h3>
<div class="jb51code"><pre class="brush:py;">result = np.random.choice(5, size=(2, 3))
print(result)
</pre></div>
<p>输出示例:</p>
<blockquote><p>[<br /> ]</p></blockquote>
<p>这在深度学习、图像随机采样或批量数据构造中非常有用。</p>
<p class="maodian"><a name="_label5"></a></p><h2>六、注意事项与常见错误</h2>
<p class="maodian"><a name="_lab2_5_6"></a></p><h3>❌ 1. 概率和不为 1</h3>
<div class="jb51code"><pre class="brush:py;">np.random.choice(, p=)
# ValueError: probabilities do not sum to 1
</pre></div>
<p>必须保证:</p>
<div class="jb51code"><pre class="brush:py;">sum(p) == 1
</pre></div>
<p class="maodian"><a name="_lab2_5_7"></a></p><h3>❌ 2. 无放回抽样数量超限</h3>
<div class="jb51code"><pre class="brush:py;">np.random.choice(5, size=10, replace=False)
# ValueError: Cannot take a larger sample than population when 'replace=False'
</pre></div>
<p>解决方案:要么允许重复(<code>replace=True</code>),要么减小 <code>size</code>。</p>
<p class="maodian"><a name="_lab2_5_8"></a></p><h3>❌ 3. 非一维数组抽样</h3>
<p><code>a</code> 必须是一维数组,若是多维数组则需先展平:</p>
<div class="jb51code"><pre class="brush:py;">matrix = np.arange(9).reshape(3, 3)
choice = np.random.choice(matrix.flatten(), size=4)
print(choice)
</pre></div>
<p class="maodian"><a name="_label6"></a></p><h2>七、实战案例</h2>
<p class="maodian"><a name="_lab2_6_9"></a></p><h3>案例 1:模拟掷骰子</h3>
<div class="jb51code"><pre class="brush:py;">dice =
rolls = np.random.choice(dice, size=10, replace=True)
print("掷骰结果:", rolls)
</pre></div>
<p class="maodian"><a name="_lab2_6_10"></a></p><h3>案例 2:随机抽取样本用于验证集</h3>
<div class="jb51code"><pre class="brush:py;">data = np.arange(100)
test_idx = np.random.choice(data, size=20, replace=False)
print("测试集索引:", test_idx)
</pre></div>
<p class="maodian"><a name="_lab2_6_11"></a></p><h3>案例 3:加权随机推荐系统</h3>
<div class="jb51code"><pre class="brush:py;">users = ["新用户", "普通用户", "VIP用户"]
weights = # 新用户更容易被推荐
recommend = np.random.choice(users, size=5, p=weights)
print("推荐结果:", recommend)
</pre></div>
<p class="maodian"><a name="_label7"></a></p><h2>八、与其他随机函数的对比</h2>
<table><thead><tr><th>函数</th><th>功能</th><th>是否支持权重</th><th>示例</th></tr></thead><tbody><tr><td>np.random.choice()</td><td>从数组随机选取</td><td>✅ 是</td><td>离散抽样</td></tr><tr><td>np.random.randin()</td><td>生成随机整数</td><td>❌ 否</td><td>均匀分布</td></tr><tr><td>np.random.rand()</td><td>生成 0~1 之间的浮点数</td><td>❌ 否</td><td>连续分布</td></tr><tr><td>np.random.randn()</td><td>生成服从正态分布的浮点数</td><td>❌ 否</td><td>高斯分布</td></tr></tbody></table>
頁:
[1]