排序非常大的1D阵列

时间:2013-01-21 12:21:45

标签: numpy pandas pytables

我将第一次尝试使用Pytables,我需要在每个时间步骤将数据写入hdf文件。我将有超过100,000个时间步。当我完成后,我想按列2对我的100,000+ x 6阵列进行排序,即,我目前按时间排序所有内容,但现在我需要按降雨率(col 2)的顺序对数组进行排序。我不确定如何从这里开始。我知道将整个数组放在内存中是不明智的。任何想法如何快速有效地做到这一点?

感谢任何建议。

2 个答案:

答案 0 :(得分:4)

  

我知道将整个数组放在内存中是不明智的。

你可能会过度思考它。一个100K x 6的float64阵列只占用大约5MB的RAM。在我的计算机上,对这样的数组进行排序大约需要27ms:

In [37]: a = np.random.rand(100000, 6)

In [38]: %timeit a[a[:,1].argsort()]
10 loops, best of 3: 27.2 ms per loop

答案 1 :(得分:2)

除非您有一台非常旧的计算机,否则应将整个阵列放在内存中。假设它们是浮点数,它只需要100000*6*4./2**20 = 2.29 Mb。双打的两倍。您可以使用numpy的sort或argsort进行排序。例如,您可以从第二列获取排序索引:

import numpy as np
a = np.random.normal(0, 1, size=(100000,6))
idx = a[:, 1].argsort()

然后使用这些索引所需的列或整个数组:

b = a[idx]

您甚至可以使用不同类型的排序并检查其速度:

In [33]: %timeit idx = a[:, 1].argsort(kind='quicksort')
100 loops, best of 3: 12.6 ms per loop

In [34]: %timeit idx = a[:, 1].argsort(kind='mergesort')
100 loops, best of 3: 14.4 ms per loop

In [35]: %timeit idx = a[:, 1].argsort(kind='heapsort')
10 loops, best of 3: 21.4 ms per loop

所以你看到这个大小的数组并不重要。