Python中将不同长度列表转为NumPy兼容数组并填充NaN的高效方法
问题:将不等长嵌套列表填充为等长列表(兼容NumPy)
输入的不等长嵌套列表示例:
arr = [[0. , 1.5, 3. , 0. , 1.5], [0. , 1.5, 3. ], [0., 1.33, 2.67, 4. ]]
期望输出(以最长子列表长度为基准,用None填充空缺,最终可兼容NumPy数组):
arr_filled = [[0. , 1.5, 3. , 0. , 1.5], [0. , 1.5, 3., None, None ], [0., 1.33, 2.67, 4., None ]]
原实现方式为通过map(len, arr)获取子列表长度,循环添加None至长度一致,现提供更简洁高效的实现方案:
简洁实现方案
1. 纯Python列表推导式(简洁直观)
先获取最长子列表的长度,再通过列表推导式一次性完成填充,比循环逐个添加更高效:
max_len = max(len(sublist) for sublist in arr) arr_filled = [sublist + [None] * (max_len - len(sublist)) for sublist in arr]
2. 直接生成NumPy数组(一步满足兼容需求)
如果最终目标是生成NumPy数组,推荐用np.nan替代None(NumPy浮点数组会自动将None转为nan,nan更适合数值型数据处理),有两种实现方式:
方式一:列表推导式转NumPy数组
import numpy as np max_len = max(len(sublist) for sublist in arr) np_arr = np.array([sublist + [np.nan] * (max_len - len(sublist)) for sublist in arr])
方式二:初始化全nan数组再赋值(大数据量更高效)
避免多次列表拼接,先创建指定形状的全nan数组,再切片赋值原数据,适合处理大规模数据:
import numpy as np max_len = max(len(sublist) for sublist in arr) np_arr = np.full((len(arr), max_len), np.nan) for idx, sublist in enumerate(arr): np_arr[idx, :len(sublist)] = sublist
内容的提问来源于stack exchange,提问作者MathX
相关产品推荐
相关产品推荐

