Skip to main content
 首页 » 编程设计

python之在 1 行中进行两次 for 循环以创建一个新的元组列表

2025年05月04日11myhome

我有两组坐标作为 numpy 数组。我会根据每组的第一个元素创建一个新坐标。

a = np.array([[1,2],[3,4],[5,6]]) 
b = np.array([[10,20],[30,40],[50,60]]) 

所以我想得到

[(1,10), (3,30), (5, 50)]

我试过:

c = [(i[0], j[0]) for (i,j) in itertools.product(a,b)] 

但它返回了:

[(1, 10), (1, 30), (1, 50), (3, 10), (3, 30), (3, 50), (5, 10), (5, 30), (5, 50)]

这是一个嵌套循环。这里有一条线解决方案吗?

非常感谢

J

请您参考如下方法:

如果你想要结果作为元组,首先将它们沿着第二个轴与 np.c_ 连接起来,将结果视为元组数组并使用 ravel 展平结果:

np.c_[a[:,0],b[:,0]].view('i,i').ravel() 
# array([(1, 10), (3, 30), (5, 50)], dtype=[('f0', '<i4'), ('f1', '<i4')]) 

请注意,使用 numpy 的向量化运算获取结果将在性能方面带来巨大好处:

a = np.array([[1,2],[3,4],[5,6]]) 
b = np.array([[10,20],[30,40],[50,60]]) 
a = np.concatenate([a]*10000) 
b = np.concatenate([b]*10000) 
 
%timeit [(a_s[0], b_s[0]) for a_s, b_s in zip(a,b)] 
# 19.2 ms ± 1.5 ms per loop (mean ± std. dev. of 7 runs, 10 loops each) 
 
%timeit np.c_[a[:,0],b[:,0]].view('i,i').ravel() 
# 82.1 µs ± 7.73 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)