2012-09-12 61 views
4

我有一個N×2維numpy數組。我想做一個(2 * N)x 2,其中每列重複。我很好奇,如果有比我下面寫的更有效的方法來完成這項任務。插入一個numpy數組本身

>>> a = np.array([[1,2,3,4], 
        [2,4,6,8]]) 
>>> b = np.array(zip(a.T,a.T)) 
>>> b.shape = (2*len(a[0]), 2) 
>>> b.T 
array([[1, 1, 2, 2, 3, 3, 4, 4], 
     [2, 2, 4, 4, 6, 6, 8, 8]]) 

上面的代碼是通過numpy的標準,很可能是因爲zip的。是否有numpy函數可以用zip替換?或者更好的方法來完成這一切?

回答

6

你可以使用repeat

import numpy as np 

def slow(a): 
    b = np.array(zip(a.T,a.T)) 
    b.shape = (2*len(a[0]), 2) 
    return b.T 

def fast(a): 
    return a.repeat(2).reshape(2, 2*len(a[0])) 

def faster(a): 
    # compliments of WW 
    return a.repeat(2, axis=1) 

In [42]: a = np.array([[1,2,3,4],[2,4,6,8]]) 

In [43]: timeit slow(a) 
10000 loops, best of 3: 59.4 us per loop 

In [44]: timeit fast(a) 
100000 loops, best of 3: 4.94 us per loop 

In [45]: a = np.arange(100).reshape(2, 50) 

In [46]: timeit slow(a) 
1000 loops, best of 3: 489 us per loop 

In [47]: timeit fast(a) 
100000 loops, best of 3: 6.7 us per loop 

[更新]:

In [101]: timeit faster(a) 
100000 loops, best of 3: 4.4 us per loop 
+1

美麗。我不能希望有更好的。 – Wilduck

+3

您可以使用'axis'參數簡化重複的使用:'a.repeat(2,axis = 1)'。 –

+0

@WarrenWeckesser:對,你是! – DSM