我有两组坐标作为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)
尝试内置函数zip
:
print([(a_s[0], b_s[0]) for a_s, b_s in zip(a,b)])
# [(1, 10), (3, 30), (5, 50)]
temp_arr = np.concatenate([a[:,:,None],b[:,:,None]],axis=2)
temp_arr[:,0]
array([[ 1, 10],
[ 3, 30],
[ 5, 50]])