2014-02-21 18 views
2

A是numpy的阵列,如:重复数组的每一个值的两倍(numpy的)

A = np.array([1, 2, 3, 4, 5]) 

我想找到生产与每个值的新阵列的更清洁的方式重复了两次:

B = np.array([1, 1, 2, 2, 3, 3, 4, 4, 5, 5]) 

您认为这是更简单的方法吗?

import numpy as np 
B = np.tile(A,2).reshape(2,-1).flatten('F') 

回答

3

您可以使用numpy.column_stacknumpy.ndarray.flatten

In [12]: numpy.column_stack((A, A)).flatten()              
Out[12]: array([1, 1, 2, 2, 3, 3, 4, 4, 5, 5]) 

时机比较:

In [27]: A = numpy.array([1, 2, 3, 4, 5]*1000)             

In [28]: %timeit numpy.column_stack((A, A)).flatten()            
10000 loops, best of 3: 44.7 µs per loop               

In [29]: %timeit numpy.repeat(A, 2)                
10000 loops, best of 3: 104 µs per loop               

In [30]: %timeit numpy.tile(A,2).reshape(2,-1).flatten('F')          
10000 loops, best of 3: 129 µs per loop  
+0

谢谢你的时间比较。你还可以粘贴完整的代码进行时间比较吗? (带'import timeit'等) – Basj

+0

@Basj这就是整个代码:),我用这个[IPython shell](http://ipython.org/ipython-doc/dev/interactive/shell.html)。您也可以在线尝试:https://www.pythonanywhere.com/try-ipython/ –

+0

不知道为什么,但我得到了不同的时间顺序(对于x10尺寸A): In [19]:% timeit numpy.column_stack((A,A))。flatten() 1000个循环,最好是3:每个循环657 us In [20]:%timeit numpy.tile(A,2).reshape(2, - 1).flatten('F') 1000循环,最好为3:574 us每个循环 –

10

使用repeat()

In [1]: import numpy as np 

In [2]: A = np.array([1, 2, 3, 4, 5]) 

In [3]: np.repeat(A,2) 
Out[3]: array([1, 1, 2, 2, 3, 3, 4, 4, 5, 5]) 
2

如果你需要在一个时间关键区域做此操作,下面的代码是最快的(使用numpy的1.9开发版):

In [1]: A = numpy.array([1, 2, 3, 4, 5]*1000) 
In [2]: %timeit numpy.array([A, A]).T.ravel('F') 
100000 loops, best of 3: 6.44 µs per loop 

需要注意的是扁平化将使额外的副本,所以拉威尔应改为使用。

如果你喜欢的可读性,在column_stack和重复功能更好:

In [3]: %timeit numpy.column_stack((A, A)).ravel() 
100000 loops, best of 3: 15.4 µs per loop 

In [4]: timeit numpy.repeat(A, 2) 
10000 loops, best of 3: 53.9 µs per loop 
相关问题