如何用Numpy方法将(x,y,z)形状数组转为(x,y)且元素为z长度列表
实现方法详解
当然可以实现!下面给你两种实用的Numpy方法,帮你把(x, y, z)形状的数组转换成(x, y)形状、每个元素为长度z的列表的数组:
方法一:使用np.apply_along_axis(简洁写法)
这个方法可以沿着指定的轴对数组元素进行批量处理,代码非常简洁:
import numpy as np # 示例数组:形状(2, 2, 3) arr = np.arange(12).reshape(2, 2, 3) # 沿着第三个轴(axis=2),把每个轴上的元素转为列表 result = np.apply_along_axis(lambda x: x.tolist(), axis=2, arr=arr) # 验证结果 print(result.shape) # 输出 (2, 2) print(result[0, 0]) # 输出 [0, 1, 2],类型为list
apply_along_axis会自动遍历数组的前两个维度,把每个位置上的z维子数组转换成Python列表,最终得到一个dtype=object的Numpy数组,正好符合你的需求。
方法二:手动创建object数组赋值(高效写法)
如果你的数组规模较大,手动创建object类型数组再逐位置赋值的方式会更高效,避免apply_along_axis内部的额外开销:
import numpy as np arr = np.arange(12).reshape(2, 2, 3) # 创建一个形状为(x,y)、dtype为object的空数组 result = np.empty(arr.shape[:2], dtype=object) # 遍历每个位置,将z维子数组转为列表后赋值 for i in range(arr.shape[0]): for j in range(arr.shape[1]): result[i, j] = arr[i, j].tolist() # 验证结果 print(result.dtype) # 输出 object print(result[1, 1]) # 输出 [9, 10, 11]
注意事项
最终得到的数组是object类型的Numpy数组,因为Numpy的数值型数组无法直接存储Python列表,object类型允许每个元素存放任意Python对象(这里就是列表)。
内容的提问来源于stack exchange,提问作者user5354375
相关产品推荐
相关产品推荐

