2015-10-06 48 views
0

我有六個numpy數組,我需要轉換成一個數組或甚至更好,一個列表(如果有一個更快的方式作爲tolist()你想推薦我)。無論如何,我需要這個處理來自.gif的圖像數據,所以它必須非常快。我最近的嘗試以8幀/秒的處理時間結束。我將數組轉換爲列表,但我很確定它是否可以用數組方法完成,它會更快。排序多個numpy數組成一個像這樣:[1,2,.. n,1,2..n]

這些數組具有相同的長度,它們是一維的,長度從4096開始,並填充布爾值。

principial它應該做如下:

a = array((1,3,5)) 
b = array((2,4,6)) 

>>> array([1, 2, 3, 4, 5, 6]) 

因此,這裏是我最近嘗試:

for x in range(size): 
    counter += 1 
    print(b0[x] 
    data_bin.insert(0, 0) 
    data_bin.insert(1, 0) 
    data_bin.insert(2, b0[x]) 
    data_bin.insert(3, b1[x]) 
    data_bin.insert(4, r0[x]) 
    data_bin.insert(5, g0[x]) 
    data_bin.insert(6, r1[x]) 
    data_bin.insert(7, g1[x]) 

然後我寫data_bin的內存空間,並清除值。我可以在10ms內寫入1幀,所以整個程序應花費大約8ms。

爲了抑制混亂,我從圖像中獲取數據格式的數據,並且必須按照正確的順序獲取它們。之後我必須將其轉換爲字符串,因爲這是我寫入內存的最快方式。

謝謝:)根據您所需的輸出

+0

所以,基本上你要'zip'和'chain'陣列?有點像'[x for y in zip([1,3,5],[2,4,6])for x in y]',快一點,用numpy? –

+0

我還不確定你的第一個例子與第二個例子相關。你確定預定的訂單是正確的嗎? 'r0,r1,g0,g1,b0,b1'與'a'和'b'有什麼關係? –

+0

@tobias_k對不起,第一個例子只是它應該做的一個演示,第二個例子來自我的代碼,我沒有改變什麼。所以orde應該像'code [0,0,b0 [x],b1 [x],r0 [x],g0 [x],r1 [x],g1 [x]](前兩位是抵消)。然後重複,直到x = 4096 – InvAdErZz

回答

1

看來你是一個接一個地從六個輸入中插入個元素,但是從最後一個元素開始直到每個輸入的第一個元素。基本上這是一個連接過程,零點定期附加(2+6)。

一種方法能夠有效地做到這一點,而不是循環,將與np.concatenate -

size = len(b0) # Must be 4096 

# Initialize output as a 2D array with zeros that would also hold all elements 
# from the six inputs 
out = np.zeros((size,8),dtype=b0.dtype) 

# Leave first two elements in each row and 
# put inputs-concatenated and flipped version into the output array 
out[:,2:] = np.concatenate((b0,b1,r0,g0,r1,g1)).reshape(-1,size)[:,::-1].T 

# Finally convert to list if needed 
data_bin_out = out.ravel().tolist() 

運行測試和驗證輸出 -

1)設置輸入:

In [2]: # Inputs 
    ...: size = 4096 
    ...: b0 = np.random.randint(2,9,(size)) 
    ...: b1 = np.random.randint(2,9,(size)) 
    ...: r0 = np.random.randint(2,9,(size)) 
    ...: g0 = np.random.randint(2,9,(size)) 
    ...: r1 = np.random.randint(2,9,(size)) 
    ...: g1 = np.random.randint(2,9,(size)) 
    ...: 

2 )定義方法 -

def concat_app(b0,b1,r0,g0,r1,g1): 
    out = np.zeros((size,8),dtype=b0.dtype) 
    out[:,2:] = np.concatenate((b0,b1,r0,g0,r1,g1)).reshape(-1,size)[:,::-1].T 
    return out.ravel().tolist() 

def org_app(b0,b1,r0,g0,r1,g1): 
    data_bin = [] 
    counter = 0 
    for x in range(size): 
     counter += 1 
     data_bin.insert(0, 0) 
     data_bin.insert(1, 0) 
     data_bin.insert(2, b0[x]) 
     data_bin.insert(3, b1[x]) 
     data_bin.insert(4, r0[x]) 
     data_bin.insert(5, g0[x]) 
     data_bin.insert(6, r1[x]) 
     data_bin.insert(7, g1[x]) 
    return data_bin 

3)時序和驗證:

In [4]: %timeit org_app(b0,b1,r0,g0,r1,g1) 
1 loops, best of 3: 556 ms per loop 

In [5]: %timeit concat_app(b0,b1,r0,g0,r1,g1) 
1000 loops, best of 3: 648 µs per loop 

In [6]: concat_app(b0,b1,r0,g0,r1,g1) == org_app(b0,b1,r0,g0,r1,g1) 
Out[6]: True 
+0

我必須道歉!您的解決方案比@RutkerKassies解決方案快得多。兩者都在爲我的目的而工作,但不是約50ms(@Rutker),它大約需要566μs,因爲您的驗證也被破壞了。謝謝 !! :) – InvAdErZz

+0

@InvAdErZz並不感到驚訝。 'np.concatenate'在內部用於其他堆棧funcs,比如'np.hstack','np.vstack'等等,所以你可以避免使用它的func調用。看到這裏的一些相關的基準 - http://stackoverflow.com/a/32697426/3293881 – Divakar

2

我會說:

np.dstack((a, b)).flatten() 

array([1, 2, 3, 4, 5, 6]) 

但背景是有點不清楚。你從什麼類型的陣列開始?無論如何,我會盡可能堅持使用Numpy,並避免大量列表操作。按元素插入列表元素可能會導致列表中的許多重新分配,因爲大小會繼續擴大。這是沒有必要的,因爲您現在已經事先確定了尺寸。

+0

是的,正是我期待的!謝謝:) – InvAdErZz

相關問題