2014-02-05 113 views
1

這似乎是一個簡單的問題,但我一直在努力試圖有效地分割的2D陣列:numpy的陣列分割/分區效率

start_time = time.time() 
M = np.ones((400,400)) 

for i in range(10000): 
    e = np.array_split(M, 20) 
print time.time() - start_time 

然而,這個過程需要〜6秒比較〜0.5在Mathematica中使用分區函數實現的秒數,當數組變得更大時這可能成爲一個負擔。有什麼辦法可以加速這個過程嗎?

回答

2

np.array_split在將陣列分成不平整塊時可能會有用。在這裏,每個項目的e的大小是一樣的,所以你可以只使用reshape

e = M.reshape(20,-1) 

這將是非常快的,因爲它不需要陣列的複製,僅更改了磁盤陣列的形狀屬性。

e將是形狀的二維NumPy數組(20,8000),而不是NumPy數組列表。


In [56]: M = np.ones((400,400)) 

In [60]: %timeit M.reshape(20,-1) 
1000000 loops, best of 3: 447 ns per loop 
+0

這是令人難以置信!謝謝!!順便說一下,'-1'是什麼? –

+2

調用'reshape'中的'-1'告訴'reshape'用'M'中的所有項來填充任何需要的數字。由於M具有形狀(400,400),因此有160000個項目。如果第一個軸的長度是20,那麼第二個軸的長度必須是160000/20 = 8000。而不是數學計算,你只需放入'-1',讓它重新做好工作。 – unutbu