a= array([1,3,5,7,9])
b= array([2,4,6,8,10])
我想混合一对数组,以便它们的序列逐个元素地插入 示例:使用a和b,它应该导致
c= array([1,2,3,4,5,6,7,8,9,10])
我需要在数千个序列上使用成对的长数组(超过一百个元素)来做到这一点。比每个阵列上的逐个元素酸洗更聪明的想法? 感谢
答案 0 :(得分:9)
c = np.empty(len(a)+len(b), dtype=a.dtype)
c[::2] = a
c[1::2] = b
(假定a
和b
具有相同的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
使用vstack((a,b)).T.flatten()
,a
和b
被复制以创建vstack((a,b))
,然后通过flatten()
方法再次复制数据。
ravel([a, b], order='F')
实现为asarray([a, b]).ravel(order)
,需要复制a
和b
,然后复制结果以创建一个order='F'
的数组。 (如果只做ravel([a, b])
,它与我的答案大致相同,因为它不必再次复制数据。不幸的是,需要order='F'
来获得交替模式。)< / p>
所以其他两种方法复制数据两次。在我的版本中,每个数组都被复制一次。
答案 1 :(得分:3)
这样做:
vstack((a,b)).T.flatten()
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
答案 2 :(得分:3)
使用numpy.ravel
:
>>> np.ravel([a, b], order='F')
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])