我将第一次尝试使用Pytables,我需要在每个时间步骤将数据写入hdf文件。我将有超过100,000个时间步。当我完成后,我想按列2对我的100,000+ x 6阵列进行排序,即,我目前按时间排序所有内容,但现在我需要按降雨率(col 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
所以你看到这个大小的数组并不重要。