如何按指定顺序重塑NumPy数组?实现数组a到b的转换
解决NumPy数组按时间点分组重塑的问题
嘿,我帮你搞定这个数组重塑的需求!首先咱们先理清两个数组的维度对应关系,这样就能找到最直接的解决办法。
维度分析
你的原数组a的shape是(3, 2, 4),对应:
- 第0轴:3次重复(r1、r2、r3)
- 第1轴:2个变量(v1、v2)
- 第2轴:4个时间点(t1到t4)
目标数组b的shape是(4, 3, 2),对应:
- 第0轴:4个时间点
- 第1轴:3次重复
- 第2轴:2个变量
你需要的是把时间点轴提到最前面,然后保持重复轴、变量轴的顺序,这时候用NumPy的transpose(轴变换)就可以完美解决,而不是单纯的reshape(因为reshape只是改变形状,不会调整元素的分组逻辑)。
正确代码实现
import numpy as np # 原数组a a = np.array([ [['r1_v1_t1','r1_v1_t2','r1_v1_t3','r1_v1_t4'], ['r1_v2_t1','r1_v2_t2','r1_v2_t3','r1_v2_t4']], [['r2_v1_t1','r2_v1_t2','r2_v1_t3','r2_v1_t4'], ['r2_v2_t1','r2_v2_t2','r2_v2_t3','r2_v2_t4']], [['r3_v1_t1','r3_v1_t2','r3_v1_t3','r3_v1_t4'], ['r3_v2_t1','r3_v2_t2','r3_v2_t3','r3_v2_t4']] ]) # 用transpose调整轴顺序:原轴(重复, 变量, 时间) → 目标轴(时间, 重复, 变量) b = np.transpose(a, axes=(2, 0, 1)) # 验证结果是否和你要的一致 print(np.array_equal(b, np.array([ [['r1_v1_t1','r1_v2_t1'],['r2_v1_t1','r2_v2_t1'],['r3_v1_t1','r3_v2_t1']], [['r1_v1_t2','r1_v2_t2'],['r2_v1_t2','r2_v2_t2'],['r3_v1_t2','r3_v2_t2']], [['r1_v1_t3','r1_v2_t3'],['r2_v1_t3','r2_v2_t3'],['r3_v1_t3','r3_v2_t3']], [['r1_v1_t4','r1_v2_t4'],['r2_v1_t4','r2_v2_t4'],['r3_v1_t4','r3_v2_t4']] ]))) # 输出True,说明结果正确
为什么你之前的方法无效?
a.T:转置会把轴顺序变成(4, 2, 3),也就是时间点、变量、重复,和你需要的(4,3,2)(时间点、重复、变量)不符,所以结构不对。np.reshape(a,(4,3,2))或order='F':reshape只是按照内存顺序(C或Fortran顺序)重新排列元素,不会按照你需要的“按时间点提取每组元素”的逻辑分组,所以得到的元素顺序完全不符合要求。
内容的提问来源于stack exchange,提问作者lanselibai
相关产品推荐
相关产品推荐

