如何对Python多维数组的特定列进行垂直打乱?
解决方案:垂直打乱特定列,保留其他列不变
嗨,作为Python新手,你这个需求完全可以实现,而且有两种常用的方式——一种用Python内置工具不用额外装库,另一种用你提到的numpy,都能轻松搞定。下面给你一步步讲清楚:
一、纯Python内置方法(无需额外库)
核心思路是:把要打乱的列单独提取出来,对每一列单独随机打乱,再把打乱后的列放回原数组的对应位置,同时保留不需要打乱的列不动。
代码示例
import random # 你的原始数组 original_arr = [ [59, '591', '592', '593', '594', 1582823720], [9, '91', '92', '93', '94', 1582823745], [7, '71', '72', '73', '74', 1582823745], [61, '611', '612', '613', '614', 1582823752], [54, '541', '542', '543', '544', 1582823717], [24, '241', '242', '243', '244', 1582823706] ] # 定义要打乱的列索引(Python从0开始,第2-5列对应索引1到4) cols_to_shuffle = [1, 2, 3, 4] # 提取每一列的数据 columns = [] for col_idx in cols_to_shuffle: col_data = [row[col_idx] for row in original_arr] columns.append(col_data) # 对每一列单独打乱 for col in columns: random.shuffle(col) # shuffle是原地打乱,直接修改原列表 # 重组数组:保留第0列和第5列,替换打乱后的列 result_arr = [] for row_idx in range(len(original_arr)): new_row = [ original_arr[row_idx][0], # 保留第1列(原索引0) columns[0][row_idx], # 打乱后的第2列(原索引1) columns[1][row_idx], # 打乱后的第3列(原索引2) columns[2][row_idx], # 打乱后的第4列(原索引3) columns[3][row_idx], # 打乱后的第5列(原索引4) original_arr[row_idx][5] # 保留第6列(原索引5) ] result_arr.append(new_row) # 打印结果 for row in result_arr: print(row)
关键说明
random.shuffle()是原地打乱列表,如果你不想修改原列数据,可以用random.sample(col_data, len(col_data))返回一个新的打乱后的列表。- 这个方法完全用Python内置模块,适合数据量不大的场景,新手也容易理解每一步的操作。
二、使用numpy库(更高效,适合大数据)
如果你已经在用numpy,那这个方法会更简洁高效,尤其是数据量较大的时候。核心是对指定列的每一列,用随机排列的索引重新赋值。
代码示例
import numpy as np # 转成numpy数组 original_np = np.array(original_arr, dtype=object) # 因为有数字和字符串,用object类型 # 要打乱的列索引(1到4) cols_to_shuffle = [1, 2, 3, 4] # 对每一列单独打乱 for col_idx in cols_to_shuffle: # 生成随机排列的索引 shuffled_indices = np.random.permutation(len(original_np)) # 重新赋值该列 original_np[:, col_idx] = original_np[shuffled_indices, col_idx] # 转回普通列表(如果需要的话) result_np = original_np.tolist() # 打印结果 for row in result_np: print(row)
关键说明
np.random.permutation(n)会生成0到n-1的随机排列索引,用这个索引去取原列的数据,就实现了垂直打乱。- 因为你的数组里混合了整数和字符串,所以转numpy数组时要指定
dtype=object,避免类型转换错误。 - 这个方法比纯Python更快,适合处理大规模的多维数组。
小提示
两种方法都能实现你要的效果:保留第1列(索引0)和第6列(索引5)完全不变,只打乱第2-5列(索引1-4)的垂直顺序,而且每一列的打乱是独立的(和你给出的预期结果逻辑一致)。
内容的提问来源于stack exchange,提问作者Acidon
相关产品推荐
相关产品推荐

