如何用Numpy实现类似itertools.zip_longest的不等长数组交错合并?
NumPy实现类似itertools.zip_longest的交错填充效果
当然有啦!其实NumPy里有不少简洁的向量化方法可以实现你要的效果,完全不用依赖itertools。下面给你分享几种常用的实现方式:
方法一:Padding + 堆叠转置 + 扁平化
这是最直观的方式,先把短数组用0补到最长数组的长度,再将数组堆叠后转置,最后扁平化就能得到交错的结果:
import numpy as np a = np.array([1, 5, 9, 13]) b = np.array([2, 6]) # 获取最长数组的长度 max_len = max(a.size, b.size) # 对短数组补0,长度对齐到max_len a_padded = np.pad(a, (0, max_len - a.size), mode='constant') b_padded = np.pad(b, (0, max_len - b.size), mode='constant') # 堆叠数组、转置(让对应位置元素成组)、扁平化 result = np.stack([a_padded, b_padded]).T.flatten() print(result) # 输出: [ 1 2 5 6 9 0 13 0]
方法二:预创建填充数组 + 赋值 + 扁平化
如果你觉得pad函数不够直观,也可以先创建一个全0的二维数组,再把原数组的值赋值进去,后续操作和方法一一致:
import numpy as np a = np.array([1, 5, 9, 13]) b = np.array([2, 6]) max_len = max(a.size, b.size) # 创建形状为(2, max_len)的全0数组 filled_arr = np.full((2, max_len), 0) # 将原数组的值赋值到对应位置 filled_arr[0, :a.size] = a filled_arr[1, :b.size] = b # 转置后扁平化得到结果 result = filled_arr.T.ravel() print(result) # 输出: [ 1 2 5 6 9 0 13 0]
扩展到多个数组的情况
如果你的需求不止两个数组,这两种方法都能轻松扩展,和itertools.zip_longest处理多列表的逻辑一致:
import numpy as np arrays = [ np.array([1, 5, 9, 13]), np.array([2, 6]), np.array([3, 7, 11]) ] max_len = max(arr.size for arr in arrays) # 批量padding所有数组 padded_arrays = [np.pad(arr, (0, max_len - arr.size), mode='constant') for arr in arrays] # 堆叠、转置、扁平化 result = np.stack(padded_arrays).T.flatten() print(result) # 输出: [ 1 2 3 5 6 7 9 0 11 13 0 0]
为什么用NumPy而不是itertools?
和itertools的纯Python循环实现相比,NumPy的向量化操作在处理大规模数据时效率高得多,而且代码风格更贴合数值计算场景,后续如果需要对结果做进一步的NumPy运算也会更顺畅。
内容的提问来源于stack exchange,提问作者yatu
相关产品推荐
相关产品推荐

