如何根据DataFrame列值将二维NumPy数组重构为三维数组?
如何根据Pandas DataFrame的列值将二维NumPy数组转换为三维数组?
这其实可以借助Pandas的分组功能快速实现,核心思路是先按Case列分组获取对应行的索引,再从二维数组中提取对应行打包成三维结构。下面是具体的步骤和代码:
1. 导入依赖并定义示例数据
首先我们先把示例数据准备好(我把原问题里的省略号替换成了具体数值方便测试):
import numpy as np import pandas as pd # 模拟的二维NumPy数组 two_d_array = np.array([ [1., 0., 0., 1., 0., 0.], [1., 0., 0., 0., 1., 1.], [1., 0., 0., 1., 0., 0.], [1., 1., 0., 1., 0., 0.], [1., 1., 0., 1., 0., 0.], [1., 1., 0., 1., 0., 0.] ]) # 示例DataFrame df = pd.DataFrame({"Case":[1,1,2,2,3,4]})
2. 实现转换逻辑
我们可以用groupby获取每个Case对应的行索引集合,再通过列表推导式提取对应行,最后转成三维数组:
# 获取每个Case对应的行索引集合 case_groups = df.groupby('Case').groups # 遍历索引集合,从二维数组中提取对应行,组成三维数组 three_d_array = np.array([two_d_array[idxs] for idxs in case_groups.values()], dtype=object)
3. 结果说明
运行后得到的three_d_array就是你想要的结构:
- 第一个元素是
Case=1对应的两行二维数组 - 第二个元素是
Case=2对应的两行二维数组 - 第三、第四个元素分别是
Case=3和Case=4对应的单行二维数组
需要注意的是:因为各个分组的行数不一致(有的2行,有的1行),所以必须指定dtype=object,否则NumPy会强制统一形状导致报错。如果你的所有分组行数都相同,就可以去掉这个参数,得到一个规则的三维数组(形状为(分组数, 每组行数, 列数))。
内容的提问来源于stack exchange,提问作者Indy
相关产品推荐
相关产品推荐

