簡體   English   中英

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

[英]Fastest way to mix arrays in numpy?

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])

我需要在數千個序列上使用成對的長數組(超過一百個元素)來做到這一點。 比每個陣列上的逐個元素酸洗更聰明的想法? 謝謝

c = np.empty(len(a)+len(b), dtype=a.dtype)
c[::2] = a
c[1::2] = b

(假設ab具有相同的dtype。)

你問最快,所以這里有一個時間比較( vstackravelempty都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()ab以創建vstack((a,b)) ,然后通過flatten()方法再次復制數據。

ravel([a, b], order='F')實現為asarray([a, b]).ravel(order) ,它需要復制ab ,然后復制結果以創建一個order='F' (如果你只做ravel([a, b]) ,它與我的答案大致相同,因為它不必再次復制數據。不幸的是,需要order='F'來獲得交替模式。)

所以其他兩種方法復制數據兩次。 在我的版本中,每個數組都被復制一次。

這樣做:

vstack((a,b)).T.flatten()

array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

使用numpy.ravel

>>> np.ravel([a, b], order='F')
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM