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

如何用Numpy生成三值域全排列矩阵并转为排序后的Pandas DataFrame

生成包含多列值域全排列的Pandas DataFrame

完全不需要递归,用Python标准库或Pandas的现成工具就能轻松实现,以下是两种高效方案:

方案1:用itertools.product生成笛卡尔积

itertools.product专门用来生成多个可迭代对象的笛卡尔积,正好对应你需要的所有排列组合,步骤清晰直接:

import pandas as pd
from itertools import product

# 你的值域示例
a = [0,1,2,3,4,5,6,7]
b = [0,1,2]
c = [0,1]

# 生成所有组合
all_combinations = list(product(a, b, c))
# 转为DataFrame并指定列名
df = pd.DataFrame(all_combinations, columns=['c1', 'c2', 'c3'])
# 按c1、c2、c3升序排序(product生成的顺序本身已经符合要求,显式排序更保险)
df = df.sort_values(by=['c1', 'c2', 'c3']).reset_index(drop=True)

运行后得到的DataFrame正好是48行(8×3×2),完全符合你的需求。

方案2:用Pandas的cross merge

如果习惯用Pandas的原生操作,可以通过多次交叉合并实现同样效果:

import pandas as pd

a = [0,1,2,3,4,5,6,7]
b = [0,1,2]
c = [0,1]

# 将每个值域转为单独的DataFrame
df_c1 = pd.DataFrame(a, columns=['c1'])
df_c2 = pd.DataFrame(b, columns=['c2'])
df_c3 = pd.DataFrame(c, columns=['c3'])

# 依次交叉合并,生成全组合
df = df_c1.merge(df_c2, how='cross').merge(df_c3, how='cross')
# 排序并重置索引
df = df.sort_values(by=['c1', 'c2', 'c3']).reset_index(drop=True)

作为掩码合并稀疏矩阵的用法

生成全组合DataFrame后,你可以直接用它来对齐稀疏矩阵的数据:

  1. 如果稀疏矩阵的行顺序和全组合的顺序一致,直接将数据列添加到DataFrame即可:
    # 假设sparse_data是你的稀疏矩阵数据(一维数组或Series)
    df['sparse_values'] = sparse_data
    
  2. 如果需要筛选特定组合作为掩码,直接用布尔索引:
    # 例如筛选c1=3且c2=2的行作为掩码
    mask = (df['c1'] == 3) & (df['c2'] == 2)
    masked_data = df[mask]
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 09:58:17