Python中实现张量与列表高效嵌套zip的方法
实现方案说明
需求背景
两个已知输入:
- 3行6列的PyTorch张量
mytensor,存储浮点型数值:
mytensor = tensor([[0.6193, 0.6647, 0.4719, 0.5521, 0.5549, 0.4047], [0.5618, 0.5821, 0.4368, 0.5164, 0.5080, 0.3930], [0.5705, 0.5892, 0.4449, 0.5204, 0.5105, 0.4008]])
- 长度为6的元组
mylist,存储每一列对应的标签:
mylist = ('buy', 'book', 'test', 'sell', 'watch', 'sell')
期望得到的输出是,将张量每一行的数值与mylist逐位配对成元组,最终形成嵌套列表结构:
[[('buy', 0.6193), ('book', 0.6647), ('test', 0.4719), ('sell', 0.5521), ('watch', 0.5549), ('sell', 0.4047)], [('buy', 0.5618), ('book', 0.5821), ('test', 0.4368), ('sell', 0.5164), ('watch', 0.5080), ('sell', 0.3930)], [('buy', 0.5705), ('book', 0.5892), ('test', 0.4449), ('sell', 0.5204), ('watch', 0.5105), ('sell', 0.4008)]]
最初的实现是通过循环逐行拼接,能够正常运行:
newList= [] for values in mytensor: newList.append(list(zip(mylist, values)))
现在希望找到更简洁、性能更优的替代实现方式。
可选择的实现方案
- 语法层面的简化:用列表推导式替代显式循环的append逻辑,和原实现的运行效率没有差异,代码更紧凑、可读性更强,是Python中这类遍历拼接场景的标准写法:
newList = [list(zip(mylist, row)) for row in mytensor]
关于性能的说明
这类操作的核心开销来自于把张量中的张量类型数值,逐元素转换为Python原生浮点数,再和字符串标签绑定为Python元组。因为最终要求的输出是纯Python的列表、元组结构,这个逐元素的对象创建开销是无法完全避免的——哪怕强行用张量级别的批量操作做向量化拼接,最后还是要逐元素遍历转换为Python原生对象,不仅不会更快,反而会多一步张量格式转换的冗余开销。
如果张量规模特别大,后续并不需要这种逐元素的元组结构,只是想把标签和数值做关联处理,更高效的方案是直接将张量转为带自定义列名的DataFrame,所有数值计算都在批量层面完成,避免逐个创建Python对象的开销,性能会比生成嵌套元组结构高几个数量级。
内容的提问来源于stack exchange,提问作者GioGio
相关产品推荐
相关产品推荐

