You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在保持对应关系的同时打乱两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:30:55