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。
修复方案
需要创建原数组的副本,再对副本进行洗牌操作,有几种常用方式:
- 使用numpy数组的
copy()方法:
y_w2v_train_s = y_w2v_train_n.copy() y_w2v_pt_s = y_w2v_pt_n.copy()
- 使用
np.copy()函数:
y_w2v_train_s = np.copy(y_w2v_train_n) y_w2v_pt_s = np.copy(y_w2v_pt_n)
- 切片方式创建副本(仅适用于一维或二维数组的浅拷贝,当前场景下可用):
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
相关产品推荐
相关产品推荐

