重复两次数组的每个值(numpy)

时间:2014-02-21 10:30:24

标签: python arrays numpy

A成为一个像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 个答案:

答案 0 :(得分: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])

答案 1 :(得分: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     

答案 2 :(得分: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

请注意,flatten会生成一个额外的副本,因此应该使用ravel。

如果您更喜欢可读性,则column_stack和repeat函数更好:

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