You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:09:09