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

np.random.shuffle()未按预期工作:矩阵行洗牌问题排查

矩阵行洗牌未生效的问题排查与修复

我想要对矩阵的行进行洗牌,但运行代码后发现洗牌未生效,y_w2v_train_s与y_w2v_train_n首行元素完全一致。以下是我的代码和运行结果:

#prepare the training data
dat_training = data_all_training[sbj]


labels_training = dat_training.select("Label")
labels_test = dat_test.select("Label")



y_w2v_train_n = return_normal_features_for_MEG_training(labels_training, type_emb)
y_w2v_pt_n = return_normal_features_for_MEG_validation(labels_test, type_emb)

y_w2v_train_s = y_w2v_train_n
y_w2v_pt_s = y_w2v_pt_n


np.random.shuffle(y_w2v_train_s)
np.random.shuffle(y_w2v_pt_s)

print("sim", y_w2v_train_s[0,0:10] == y_w2v_train_n[0, 0:10])
print(y_w2v_train_s[0, 0:10])
print(y_w2v_train_n[0, 0:10])
print("shapes", x_train.shape, y_w2v_train.shape, x_test_pt.shape, y_w2v_pt.shape)

运行结果:

sim [ True  True  True  True  True  True  True  True  True  True]
[ 0.12567943  0.38765216  0.05903614  0.35545474  0.15695235 -0.09684472
  0.20318605  0.09171303  0.19060805  0.19470002]
[ 0.12567943  0.38765216  0.05903614  0.35545474  0.15695235 -0.09684472
  0.20318605  0.09171303  0.19060805  0.19470002]
shapes (7200, 99) (7200, 1000) (300, 99) (300, 1000)

问题根源

在Python中,y_w2v_train_s = y_w2v_train_n这种赋值方式并没有创建新的数组,只是让y_w2v_train_s成为y_w2v_train_n的引用——两个变量指向内存中同一个numpy数组对象。当你调用np.random.shuffle时,确实对数组做了洗牌,但因为两个变量指向同一个数组,所以y_w2v_train_n也跟着被洗牌了。你打印首行对比时,其实是在对比同一个数组的同一段数据,自然全是True。

修复方案

需要创建原数组的副本,再对副本进行洗牌操作,有几种常用方式:

  1. 使用numpy数组的copy()方法:
y_w2v_train_s = y_w2v_train_n.copy()
y_w2v_pt_s = y_w2v_pt_n.copy()
  1. 使用np.copy()函数:
y_w2v_train_s = np.copy(y_w2v_train_n)
y_w2v_pt_s = np.copy(y_w2v_pt_n)
  1. 切片方式创建副本(仅适用于一维或二维数组的浅拷贝,当前场景下可用):
y_w2v_train_s = y_w2v_train_n[:]
y_w2v_pt_s = y_w2v_pt_n[:]

修改后,y_w2v_train_s是独立的新数组,洗牌操作只会影响它,不会改变原数组y_w2v_train_n,此时再对比两者的首行就能看到洗牌效果了。

内容的提问来源于stack exchange,提问作者Kadaj13

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 03:05:02