2011-05-17 105 views
18

如果知道列表長度和數組大小,將numpy數組列表合併爲一個數組的最快方法是什麼對全部?將numpy數組列表合併爲一個數組(快速)

我嘗試了兩種方法:

一個你可以看到vstack速度較快,但由於某種原因,第一次運行需要三個次數比第二次長。我認爲這是由(缺少)preallocation造成的。那麼我如何爲vstack預分配一個數組?或者你知道更快的方法嗎?

謝謝!

[更新]

我想(25280, 320)(80, 320, 320)這意味着,merged_array = array(list_of_arrays)我不會工作。感謝Joris指出了這一點!

輸出:

0.547468900681 s merged_array = array(first_list_of_arrays) 
0.547191858292 s merged_array = array(second_list_of_arrays) 
0.656183958054 s vstack first 
0.236850976944 s vstack second 

代碼:

import numpy 
import time 
width = 320 
height = 320 
n_matrices=80 

secondmatrices = list() 
for i in range(n_matrices): 
    temp = numpy.random.rand(height, width).astype(numpy.float32) 
    secondmatrices.append(numpy.round(temp*9)) 

firstmatrices = list() 
for i in range(n_matrices): 
    temp = numpy.random.rand(height, width).astype(numpy.float32) 
    firstmatrices.append(numpy.round(temp*9)) 


t1 = time.time() 
first1=numpy.array(firstmatrices) 
print time.time() - t1, "s merged_array = array(first_list_of_arrays)" 

t1 = time.time() 
second1=numpy.array(secondmatrices) 
print time.time() - t1, "s merged_array = array(second_list_of_arrays)" 

t1 = time.time() 
first2 = firstmatrices.pop() 
for i in range(len(firstmatrices)): 
    first2 = numpy.vstack((firstmatrices.pop(),first2)) 
print time.time() - t1, "s vstack first" 

t1 = time.time() 
second2 = secondmatrices.pop() 
for i in range(len(secondmatrices)): 
    second2 = numpy.vstack((secondmatrices.pop(),second2)) 

print time.time() - t1, "s vstack second" 
+2

使用['timeit'](http://docs.python.org/library/timeit.html)在Python中進行簡單的性能測試。它產生更準確的結果。 – 2011-05-17 12:45:57

+2

您希望合併的數組具有哪些維度?因爲''first1''是''(80,320,320)'',而'first2''是''(25280,320)' – joris 2011-05-17 13:02:09

+0

@joris,謝謝指出。我想要第二個,這是我最初的方法。我會在這個問題上改變它。 – Framester 2011-05-17 13:06:57

回答

18

你有80個320×320陣列?所以,你可能想使用dstack

first3 = numpy.dstack(firstmatrices) 

這將返回一個80x320x320陣列就像numpy.array(firstmatrices)作用:

timeit numpy.dstack(firstmatrices) 
10 loops, best of 3: 47.1 ms per loop 


timeit numpy.array(firstmatrices) 
1 loops, best of 3: 750 ms per loop 

如果你想使用vstack,它會返回一個25600x320陣列:

timeit numpy.vstack(firstmatrices) 
100 loops, best of 3: 18.2 ms per loop 
+0

嗨eurmiro,對不起,我的問題不清楚。我其實需要(25280,320)而不是(80,320,320)。查看我的問題的更新。 – Framester 2011-05-17 13:11:08

+0

@Framester - ok,然後用簡單的'vstack'來查看我的更新。 – eumiro 2011-05-17 13:12:54

相關問題