这是一种很少重复然后堆叠的方法 -
def repeat_stack(a, b):
a_ext = np.repeat(a, len(b),axis=0)
b_ext = np.repeat(b[None], len(a),axis=0).reshape(-1,b.shape[1])
return np.c_[a_ext, b_ext] # or use np.column_stack
示例运行 -
In [564]: a
Out[564]:
array([[1, 1],
[2, 2],
[5, 5]]) # added one more row for variety
In [565]: b
Out[565]:
array([[3, 3],
[4, 4]])
In [23]: repeat_stack(a, b)
Out[23]:
array([[1, 1, 3, 3],
[1, 1, 4, 4],
[2, 2, 3, 3],
[2, 2, 4, 4],
[5, 5, 3, 3],
[5, 5, 4, 4]])
另一个基于初始化 -
def initialization_app(a, b):
ma,na = a.shape
mb,nb = b.shape
out = np.empty((ma,mb,na+nb), dtype=np.result_type(a,b))
out[:,:,:na] = a[...,None]
out[:,:,na:] = b
out.shape = (-1, out.shape[-1])
return out
运行时测试-
In [16]: a = np.random.randint(0,9,(100,100))
In [17]: b = np.random.randint(0,9,(100,100))
In [18]: %timeit repeat_stack(a, b)
100 loops, best of 3: 5.85 ms per loop
In [19]: %timeit initialization_app(a, b)
1000 loops, best of 3: 1.81 ms per loop