如何重塑NumPy数组:将(1000,80)转换为(100,40,2)格式
Reshape NumPy array from (N, 80) to (N, 40, 2) by grouping daily features
针对你的需求,我们可以用NumPy的数组堆叠或维度转换来高效实现,完全不用手动循环处理每一天。
先明确你的数据结构:
- 原数组形状为
(1000, 80),每一行里:前40列是特征1的40天数据,后40列是特征2的同期40天数据 - 目标形状是
(1000, 40, 2),第二维度对应40天,第三维度是当天的两个特征值(特征1+特征2)
最优实现方法
最直观的方式是把原数组拆成特征1和特征2的两个子数组,然后在最后一个维度上堆叠,直接得到目标结构:
import numpy as np # 模拟你的原始数据(1000条观测,80列) data = np.random.rand(1000, 80) # 拆分特征1(前40列)和特征2(后40列) feat1 = data[:, :40] feat2 = data[:, 40:] # 在最后一个维度堆叠,得到(1000, 40, 2)的数组 result = np.stack([feat1, feat2], axis=2)
用你的示例数据验证
拿你给出的小例子测试这个方法:
data = np.array([[11, 22, 33, 44], [55, 66, 77 ,88], [99, 100, 101, 102]]) feat1 = data[:, :2] # 特征1的2天数据 feat2 = data[:, 2:] # 特征2的2天数据 result = np.stack([feat1, feat2], axis=2) print(result)
输出完全符合你的期望:
array([[[ 11, 33], [ 22, 44]], [[ 55, 77], [ 66, 88]], [[ 99, 101], [100, 102]]])
为什么你的第二种方法无效?
你尝试的np.c_[data[:, i::2] for i in range(2)].reshape((3, 2, 2))不能得到正确结果,是因为np.c_会把两个数组按列拼接成(3,4)的数组,再重塑时维度顺序不符合你要的“天-特征”结构。而np.stack能直接在指定维度合并,完美保留我们需要的层级关系。
另一种等价方法(reshape+transpose)
如果你习惯用维度转换,也可以这样写:
# 先把80列拆成2组(每组40天),再交换最后两个维度 result = data.reshape(1000, 2, 40).transpose(0, 2, 1)
这个逻辑是先将特征分组,再把“特征组”和“天数”的维度互换,同样能得到目标形状。
内容的提问来源于stack exchange,提问作者Stergios
相关产品推荐
相关产品推荐

