2014-02-05 114 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