如何用Numpy无显式循环拼接元组列表中的numpy数组
问题描述
现有如下列表:
>>> x [ (array([1. +0.j , 0.5+0.5j, 0. +0.j , 0.5-0.5j, 1. +0.j ]), array([0.5+0.5j, 0. +0.j , 0.5-0.5j, 1. +0.j , nan+0.j ])), (array([1. +0.j , 0.5+0.5j, 0. +0.j , 0.5-0.5j, 1. +0.j ]), array([0.5+0.5j, 0. +0.j , 0.5-0.5j, 1. +0.j , nan+0.j ])), (array([1. +0.j , 0.5+0.5j, 0. +0.j , 0.5-0.5j, 1. +0.j ]), array([0.5+0.5j, 0. +0.j , 0.5-0.5j, 1. +0.j , nan+0.j ])) ]
需要将该列表处理为两个一维数组:把每个元组的第一个元素拼接成一个一维数组,第二个元素拼接成另一个一维数组。
预期结果如下:
[ [1. +0.j , 0.5+0.5j, 0. +0.j , 0.5-0.5j, 1. +0.j, 1. +0.j , 0.5+0.5j, 0. +0.j , 0.5-0.5j, 1. +0.j, 1. +0.j , 0.5+0.5j, 0. +0.j , 0.5-0.5j, 1. +0.j], [0.5+0.5j, 0. +0.j , 0.5-0.5j, 1. +0.j , nan+0.j, 0.5+0.5j, 0. +0.j , 0.5-0.5j, 1. +0.j , nan+0.j, 0.5+0.5j, 0. +0.j , 0.5-0.5j, 1. +0.j , nan+0.j] ]
要求使用numpy库的标准函数实现,且不能使用显式循环。
解决方案
可以利用numpy的数组转换和拼接函数完成需求,以下是两种实现方式:
方法一:先转二维数组再拼接
- 将列表
x转换为numpy数组,此时数组形状为(3, 2, 5),对应3个元组、每个元组2个数组、每个数组5个元素; - 分别提取所有元组的第一个元素和第二个元素,用
np.concatenate()完成拼接。
代码示例:
import numpy as np # 假设x为给定的输入列表 np_arr = np.array(x) first_array = np.concatenate(np_arr[:, 0]) second_array = np.concatenate(np_arr[:, 1]) # 转换为预期的列表格式 final_result = [first_array.tolist(), second_array.tolist()]
方法二:用zip拆分后拼接
利用zip(*x)将列表中的元组按位置拆分,直接得到两个包含所有对应位置元素的迭代器,再分别拼接。
代码示例:
import numpy as np # 假设x为给定的输入列表 final_result = [np.concatenate(col).tolist() for col in zip(*x)]
两种方式均未使用显式循环,完全依赖numpy标准函数实现,最终输出格式与预期一致。
内容的提问来源于stack exchange,提问作者XYZ
相关产品推荐
相关产品推荐

