如何在ndarray/Pandas DataFrame指定列内打乱行元素并保留其他列
实现方法
针对需求,可通过以下步骤完成操作:
步骤说明
- 随机选不重复列索引:从数组列中挑选3个无重复的索引。
- 保护原数组:创建原数组的副本,避免修改原始数据。
- 打乱选中列的行内元素:可选择直观的循环逐行处理,或高效的向量化操作。
代码实现
方法一:循环逐行处理(直观易懂)
import numpy as np # 定义原数组 a = np.array([[1,3,9,8,4], [2,4,6,1,9], [7,3,0,5,8], [1,6,9,2,4]]) # 随机选择3个不重复的列索引 selected_cols = np.random.choice(a.shape[1], 3, replace=False) # 创建副本避免修改原数组 result = a.copy() # 遍历每一行,打乱选中列的元素 for row in result: # 直接原地打乱当前行选中列的元素 np.random.shuffle(row[selected_cols]) print("选中的列索引:", selected_cols) print("处理后的数组:\n", result)
方法二:向量化操作(高效适配大数据集)
如果数组规模较大,循环会影响执行效率,可使用向量化方法:
import numpy as np a = np.array([[1,3,9,8,4], [2,4,6,1,9], [7,3,0,5,8], [1,6,9,2,4]]) selected_cols = np.random.choice(a.shape[1], 3, replace=False) result = a.copy() # 为每一行生成选中列的打乱索引 shuffled_col_indices = np.array([np.random.permutation(selected_cols) for _ in range(a.shape[0])]) # 通过索引赋值完成元素打乱替换 row_indices = np.arange(a.shape[0])[:, None] result[row_indices, selected_cols] = result[row_indices, shuffled_col_indices] print("选中的列索引:", selected_cols) print("处理后的数组:\n", result)
代码说明
np.random.choice(a.shape[1], 3, replace=False):从数组总列数中随机选取3个不重复的列索引。np.random.shuffle():原地打乱数组元素,由于numpy切片是视图,修改切片会同步到副本数组。- 向量化方法中,
np.random.permutation(selected_cols)为每行生成选中列的打乱顺序,再通过索引批量赋值完成替换,彻底避免循环开销。
内容的提问来源于stack exchange,提问作者Cranjis
相关产品推荐
相关产品推荐

