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

如何在ndarray/Pandas DataFrame指定列内打乱行元素并保留其他列

实现方法

针对需求,可通过以下步骤完成操作:

步骤说明

  1. 随机选不重复列索引:从数组列中挑选3个无重复的索引。
  2. 保护原数组:创建原数组的副本,避免修改原始数据。
  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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 19:05:19