Python中NumPy库提供的函数——np.random.shuffle的基本用法

本文介绍了NumPy库中的random.shuffle函数用于随机打乱数组元素顺序,尤其在数据预处理和深度学习模型训练中的应用。通过示例展示了如何在MNIST数据集中使用该函数获取验证数据,并强调了数据打乱的重要性以消除顺序依赖。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、基本用法

np.random.shuffle是NumPy库中的一个函数,用于随机打乱数组的元素顺序。具体来说,它对排序的数组进行原地(in-place)的随机重排序,打乱数组中元素的排列顺序,以排列随机。

该函数的基本语法如下:

numpy.random.shuffle(x)

其中,x是要打乱顺序的磁盘。请注意,该函数是在原始磁盘上进行操作,不会返回新的磁盘,因此会修改磁盘的磁盘x

示例用法:

import numpy as np

arr = np.array([1, 2, 3, 4, 5])
np.random.shuffle(arr)
print(arr)  # 可能输出类似 [4, 2, 1, 5, 3] 的随机排列

np.random.shuffle主要用于数据集的随机化,例如,在训练深度学习模型时,可以用它来打乱训练样本的顺序,以保证模型不会受到数据顺序的影响。注意,这个函数不会改变数据库的形状或维度,只是重新排列元素的顺序。如果创建需要一个新的随机排列的数据库,可以先使用函数np.random.permutation创建一个新的数据库。

后面的文章我也会讲解np.random.permutation的用法。

二、在MNIST数据集中获得验证数据代码的举例说明

MNIST数据集,获得验证数据的最简单的方法就是从训练数据中事先分割20%作为验证数据,代码如下所示。
(x_train, t_train), (x_test, t_test) = load_mnist()
# 打乱训练数据
x_train, t_train = shuffle_dataset(x_train, t_train)
# 分割验证数据
validation_rate = 0.20
validation_num = int(x_train.shape[0] * validation_rate)
x_val = x_train[:validation_num]
t_val = t_train[:validation_num]
x_train = x_train[validation_num:]
t_train = t_train[validation_num:]
这里,分割训练数据前,先打乱了输入数据和教师标签。这是因为数据集的数据可能存在偏向(比如,数据从“0”到“10”按顺序排列等)。这里的shuffle_dataset函数利用np.random.shuffle。

上述的大概代码计算了一个用于验证(validation)的样本数量validation_num,以便将数据集分割成训练集和验证集。因为根据不同的数据集,有的会事先分成训练数据、验证数据、测试数据三 部分,有的只分成训练数据和测试数据两部分,有的则不进行分割。在这种情况下,用户需要自行进行分割。

具体解释如下:

  • validation_rate = 0.20:这行定义了验证集所占的比例。在这个例子中,验证集占整个数据集的20%。

  • x_train.shape[0]x_train是训练数据集,x_train.shape返回它的形状,其中[0]表示第一个维度的大小,即样本数量。

  • x_train.shape[0] * validation_rate:本行计算需要指定验证集的样本数量。此时将训练数据集中的总样本数乘以验证率,增加验证集的大小。

  • int():这个函数将计算结果转换为整数,以保证验证集的大小为整数。在某些情况下,由于计算机的精度问题,计算结果可能是一个浮点数,因此需要将其转换为整数。

所以,validation_num是一个整数,表示用于验证的样本训练数量,该数量根据验证率和数据集的大小进行计算。计算完成后,你可以用这个数量来从数据集中分离出验证集,以便在模型时进行验证和性能评估。

### 关于 `numpy.random.shuffle` 的使用 `numpy.random.shuffle` 是 NumPy 提供的一个函数,用于对一维或多维数组的第一维度进行随机打乱操作。需要注意的是,此函数会 **直接修改原数组** 而不会创建新的副本[^5]。 以下是关于 `numpy.random.shuffle` 的具体说明以及示例: #### 单维数组的打乱 对于单维数组(即一维数组),`numpy.random.shuffle` 会对整个数组的内容进行随机重排。下面是一个简单的例子: ```python import numpy as np arr = np.array([1, 2, 3, 4, 5]) print(f"原始数组: {arr}") np.random.shuffle(arr) print(f"打乱后的数组: {arr}") ``` 在这个例子中,`np.random.shuffle(arr)` 将直接修改数组 `arr` 中的元素顺序[^5]。 --- #### 多维数组的打乱 当处理多维数组时,`numpy.random.shuffle` 只会在第一个维度上进行打乱操作,而其余维度保持不变。例如: ```python import numpy as np multi_arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(f"原始二维数组:\n{multi_arr}") np.random.shuffle(multi_arr) print(f"沿第一维度打乱后的二维数组:\n{multi_arr}") ``` 在此情况下,只有二维数组的行被重新排序,列内的元素位置不受影响。 如果希望进一步对每行内部的数据也进行打乱,则需要逐一对每一行调用 `numpy.random.shuffle` 或者其他方法实现更复杂的逻辑。 --- #### 打乱列表的情况 虽然题目主要讨论了 NumPy 数组的操作,但如果涉及普通的 Python 列表,也可以通过标准中的 `random.shuffle` 来完成类似功能[^4]: ```python import random my_list = [10, 20, 30, 40, 50] print(f"原始列表: {my_list}") random.shuffle(my_list) print(f"打乱后的列表: {my_list}") ``` 这里值得注意的一点是,尽管两者名称相同,但它们分别属于不同的模块,并且适用对象不同——前者适用于 NumPy 数组,后者则针对常规 Python 数据结构如列表等。 --- ### 总结 无论是使用 `numpy.random.shuffle` 还是 `random.shuffle` ,都可以有效地达到数据随机化的目的;不过,在实际应用过程中需注意输入参数的形式及其可能带来的副作用 (比如直接更改源数据),以便合理选用适合当前场景下的工具并采取适当措施保护重要资料免受意外变动的影响[^5]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值