如何在保持对应关系的同时打乱两个numpy数组以用于神经网络小批量训练
如何在打乱numpy数组X和y时保持样本对应关系并生成小批量
要同时打乱输入X和输出y且保证每个样本的输入输出依然配对,核心思路是基于相同的随机索引对两个数组进行重排——因为X和y的第i个元素本来就是一组对应样本,只要索引打乱的规则一致,对应关系就不会断。下面是具体的实现步骤和代码:
1. 生成随机打乱的索引
首先获取样本总数,然后用numpy.random.permutation()生成一组随机排列的索引,这个函数会返回0到样本数-1的随机打乱序列:
import numpy as np # 你的原始数据 X = np.array(([2, 3], [16, 4]), dtype=float) y = np.array(([1, 0], [0, 1]), dtype=float) # 获取样本数量 n_samples = X.shape[0] # 生成打乱的索引 shuffled_indices = np.random.permutation(n_samples)
2. 用索引重排X和y
用上面生成的打乱索引分别对X和y进行索引取值,就能得到打乱后的输入输出数组,且对应样本完全对齐:
X_shuffled = X[shuffled_indices] y_shuffled = y[shuffled_indices]
3. 划分小批量
接下来可以根据你设定的批量大小,遍历打乱后的数组来生成小批量数据。比如设置batch_size=1(你可以根据需求调整为2、4等):
batch_size = 1 # 计算总共有多少个完整批次 n_batches = n_samples // batch_size for i in range(n_batches): # 计算当前批次的起始和结束索引 start_idx = i * batch_size end_idx = start_idx + batch_size # 取出当前批次的X和y X_batch = X_shuffled[start_idx:end_idx] y_batch = y_shuffled[start_idx:end_idx] # 这里就可以把X_batch和y_batch传入神经网络进行训练了 print(f"Batch {i+1}:") print(f"X_batch:\n{X_batch}") print(f"y_batch:\n{y_batch}\n")
补充说明
np.random.permutation()和np.random.shuffle()的区别是:permutation不会修改原数组,而是返回新的打乱索引;shuffle是直接在原数组上打乱,但用permutation的索引方式更安全,能避免两次打乱原数组可能出现的不一致问题。- 如果你的样本量很大,或者X和y维度差异大,用索引的方式比先组合再拆分的方法更通用,不会受维度限制。
内容的提问来源于stack exchange,提问作者Wizard
相关产品推荐
相关产品推荐

