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

在R语言中对两个矩阵进行10次10%样本的随机混洗需求

矩阵列样本随机互换实现方案

核心思路

针对两个列数相同、行数不同的矩阵,每次按以下逻辑操作:

  • 确定互换样本数:可选「两矩阵列数最小值的10%」或固定值(如50),取两者中较小值避免超出列数上限
  • 随机从两个矩阵中抽取对应数量的列,互换列的所有数据及列名
  • 重复10次,每次生成一组新的矩阵A和B

Python 实现代码

用pandas处理带列名的矩阵,numpy实现随机抽样:

import pandas as pd
import numpy as np

# 示例原始矩阵
matrix_A = pd.DataFrame(
    [[8, 1, 8], [4, 2, 4], [6, 9, 9]],
    columns=["样本A", "样本B", "样本C"]
)
matrix_B = pd.DataFrame(
    [[8, 1, 5, 6], [5, 1, 1, 7], [9, 5, 8, 2]],
    columns=["样本1", "样本2", "样本3", "样本4"]
)

def swap_columns(mat_a, mat_b, swap_count=None, pct=0.1):
    """
    互换两个矩阵的随机列
    :param mat_a: 矩阵A(DataFrame)
    :param mat_b: 矩阵B(DataFrame)
    :param swap_count: 固定互换列数,优先使用此参数
    :param pct: 互换列数占最小列数的比例,仅当swap_count为None时生效
    :return: 互换后的新矩阵A、B
    """
    min_cols = min(len(mat_a.columns), len(mat_b.columns))
    # 确定实际互换数量
    if swap_count is None:
        swap_count = max(1, int(min_cols * pct))
    else:
        swap_count = min(swap_count, min_cols)
    
    # 随机抽取要互换的列索引
    a_indices = np.random.choice(mat_a.columns, swap_count, replace=False)
    b_indices = np.random.choice(mat_b.columns, swap_count, replace=False)
    
    # 复制原矩阵避免修改原始数据
    new_a = mat_a.copy()
    new_b = mat_b.copy()
    
    # 互换列数据和列名
    for a_col, b_col in zip(a_indices, b_indices):
        # 交换数据
        new_a[a_col], new_b[b_col] = new_b[b_col].copy(), new_a[a_col].copy()
        # 交换列名
        col_names_a = new_a.columns.tolist()
        col_names_b = new_b.columns.tolist()
        idx_a = col_names_a.index(a_col)
        idx_b = col_names_b.index(b_col)
        col_names_a[idx_a], col_names_b[idx_b] = b_col, a_col
        new_a.columns = col_names_a
        new_b.columns = col_names_b
    
    return new_a, new_b

# 执行10次互换并保存结果
shuffled_pairs = []
for i in range(10):
    # 这里用固定数量1,对应示例中的互换效果;可改为swap_count=50或pct=0.1
    new_A, new_B = swap_columns(matrix_A, matrix_B, swap_count=1)
    shuffled_pairs.append((new_A, new_B))
    print(f"第{i+1}次混洗结果:")
    print("混洗后的矩阵A:")
    print(new_A.to_markdown(index=False))
    print("\n混洗后的矩阵B:")
    print(new_B.to_markdown(index=False))
    print("\n" + "-"*50 + "\n")

关键说明

  • 代码中通过copy()避免修改原始矩阵,每次互换都基于原始数据生成新矩阵
  • 可灵活切换互换规则:设置swap_count=50使用固定数量,设置swap_count=None则用10%比例
  • 输出结果会自动用Markdown表格格式展示,与你提供的示例格式一致

内容的提问来源于stack exchange,提问作者Nikita Srivastav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:15:35