如何将5个(4,3)形状的列表组合成(3,4,5)的NumPy三维数组
问题:将多个(3,4)数组组合为(3,4,5)三维数组
现有5个列表x1至x5,每个列表转换为NumPy数组后shape为(3,4)。需要将它们组合成shape为(3,4,5)的三维数组x,要求x[:,:,0]与x1相同、x[:,:,1]与x2相同,以此类推至x[:,:,4]与x5相同。
此前尝试代码:
x = np.array([x1, x2, x3, x4, x5]).reshape([3,4,5])
得到的结果不符合预期,现求正确实现方式。
列表定义
import numpy as np x1 = [[1,11,111,111.1], [1111,11111,111111,111111.1], [0.1, 0.11, 0.111, 0.1111]] x2 = [[2,22,222,222.2], [2222,22222,222222,222222.2], [0.2, 0.22, 0.222, 0.2222]] x3 = [[3,33,333,333.3], [3333,33333,333333,333333.3], [0.3, 0.33, 0.333, 0.3333]] x4 = [[4,44,444,444.4], [4444,44444,444444,444444.4], [0.4, 0.44, 0.444, 0.4444]] x5 = [[5,55,555,555.5], [5555,55555,555555,555555.5], [0.5, 0.55, 0.555, 0.5555]]
预期与错误结果对比
- 预期
x[:,:,0]输出:
array([[1, 11, 111, 111.1], [1111, 11111, 111111, 111111.1], [0.1, 0.11, 0.111, 0.1111]])
- 此前方法得到的
x[:,:,0]输出:
array([[1.000000e+00, 1.111100e+04, 1.110000e-01, 2.222000e+02], [2.000000e-01, 3.300000e+01, 3.333330e+05, 3.333000e-01], [4.444000e+03, 4.400000e-01, 5.550000e+02, 5.555555e+05]])
正确实现方式
使用np.stack函数,指定axis=2在第三个维度上堆叠数组,这样能保证每个原始数组对应三维数组的一个切片:
# 先将列表转为NumPy数组,再堆叠 arr_list = [np.array(x) for x in [x1, x2, x3, x4, x5]] x = np.stack(arr_list, axis=2) # 验证形状 print(x.shape) # 输出 (3, 4, 5) # 验证第一个切片 print(x[:,:,0])
错误原因说明
np.array([x1, x2, x3, x4, x5])会生成一个shape为(5,3,4)的数组- 直接调用
reshape([3,4,5])会按行优先顺序重新排列所有元素,完全打乱了原始数组的结构,因此得到的结果不符合预期。
内容的提问来源于stack exchange,提问作者Ross
相关产品推荐
相关产品推荐

