Python中如何将任意形状的ndarray转换为一维数组?
不规则嵌套数组转一维数组的实现方法
你调用numpy.flatten()无法得到预期结果,是因为你构造的numpy.array属于object类型数组:内部元素长度不统一,嵌套的列表是作为单个对象存储的,numpy自带的扁平化方法仅支持结构规整的标准多维数组,无法直接解析嵌套的对象元素。
解决方案
方法1:通用递归实现(支持任意嵌套深度)
这个方法不限制嵌套层数,支持同时适配列表、numpy数组等多种嵌套结构:
import numpy as np def flatten(nested_obj): for item in nested_obj: # 可根据需要调整要展开的类型范围,此处排除字符串避免拆分成单个字符 if isinstance(item, (list, tuple, np.ndarray)): yield from flatten(item) else: yield item my_array = np.array([4, [5, 6], [7, 8, 9]]) my_array_flattened = list(flatten(my_array)) # 输出结果:[4, 5, 6, 7, 8, 9]
方法2:两层嵌套专用写法(简单高效)
如果你确定只有两层嵌套,不需要适配更深的层级,可以直接用更简单的循环实现:
import numpy as np my_array = np.array([4, [5, 6], [7, 8, 9]]) my_array_flattened = [] for x in my_array: if isinstance(x, (list, np.ndarray)): my_array_flattened.extend(x) else: my_array_flattened.append(x)
补充说明
如果你的数组是结构规整的标准多维numpy数组(比如np.array([[1,2],[3,4]])这类行列长度统一的数组),直接调用np.flatten()或者np.ravel()即可完成扁平化,不需要自定义实现。
内容的提问来源于stack exchange,提问作者brownser
相关产品推荐
相关产品推荐

