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

如何对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 18:42:35