在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
相关产品推荐
相关产品推荐

