在numpy中混合阵列的最快方法?

sol*_*sol 2 python arrays performance numpy

a= array([1,3,5,7,9])
b= array([2,4,6,8,10])
Run Code Online (Sandbox Code Playgroud)

我想混合一对数组,以便它们的序列逐个元素地插入示例:使用a和b,它应该导致

c= array([1,2,3,4,5,6,7,8,9,10])
Run Code Online (Sandbox Code Playgroud)

我需要在数千个序列上使用成对的长数组(超过一百个元素)来做到这一点.比每个阵列上的逐个元素酸洗更聪明的想法?谢谢

War*_*ser 9

c = np.empty(len(a)+len(b), dtype=a.dtype)
c[::2] = a
c[1::2] = b
Run Code Online (Sandbox Code Playgroud)

(假设ab具有相同的dtype.)

你要求最快,所以这里是时间比较(vstack,ravel并且empty都是numpy函数):

In [40]: a = np.random.randint(0, 10, size=150)

In [41]: b = np.random.randint(0, 10, size=150)

In [42]: %timeit vstack((a,b)).T.flatten()
100000 loops, best of 3: 5.6 µs per loop

In [43]: %timeit ravel([a, b], order='F')
100000 loops, best of 3: 3.1 µs per loop

In [44]: %timeit c = empty(len(a)+len(b), dtype=a.dtype); c[::2] = a; c[1::2] = b
1000000 loops, best of 3: 1.94 µs per loop
Run Code Online (Sandbox Code Playgroud)

使用vstack((a,b)).T.flatten(),ab复制创建vstack((a,b)),然后通过该flatten()方法再次复制数据.

ravel([a, b], order='F')被实现为asarray([a, b]).ravel(order),这需要复制ab,然后复制的结果来创建以与阵列order='F'.(如果你这样做ravel([a, b]),它与我的答案大致相同,因为它不必再次复制数据.不幸的是,order='F'需要获得交替模式.)

所以其他两种方法复制数据两次.在我的版本中,每个数组都被复制一次.