如果知道列表長度和數組大小,將numpy數組列表合併爲一個數組的最快方法是什麼對全部?將numpy數組列表合併爲一個數組(快速)
我嘗試了兩種方法:
merged_array = array(list_of_arrays)
從Pythonic way to create a numpy array from a list of numpy arrays和vstack
一個你可以看到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"
使用['timeit'](http://docs.python.org/library/timeit.html)在Python中進行簡單的性能測試。它產生更準確的結果。 – 2011-05-17 12:45:57
您希望合併的數組具有哪些維度?因爲''first1''是''(80,320,320)'',而'first2''是''(25280,320)' – joris 2011-05-17 13:02:09
@joris,謝謝指出。我想要第二個,這是我最初的方法。我會在這個問題上改變它。 – Framester 2011-05-17 13:06:57