2

初めて Pytables を試してみようとしています。時間ステップごとにデータを hdf ファイルに書き込む必要があります。タイム ステップ数は 100,000 を超えます。完了したら、100,000+ x 6 の配列を列 2 で並べ替えたいと思います。つまり、現在、すべてを時間で並べ替えていますが、降雨率の降順 (列 2) で配列を並べ替える必要があります。ここから始める方法さえわかりません。配列全体をメモリに入れるのは賢明ではないことを知っています。これを迅速かつ効率的に行う方法はありますか?

アドバイスをいただければ幸いです。

4

2 に答える 2

4

配列全体をメモリに入れるのは賢明ではないことを知っています。

あなたはそれを考えすぎているかもしれません。100K x 6 の配列は、float64わずか 5MB の RAM しか必要としません。私のコンピューターでは、このような配列の並べ替えには約 27 ミリ秒かかります。

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
于 2013-01-21T12:32:58.640 に答える
2

非常に古いコンピュータを使用していない限り、配列全体をメモリに配置する必要があります。100000*6*4./2**20 = 2.29それらが浮動小数点数であると仮定すると、 Mbしかかかりません。ダブルスなら2倍。並べ替えには numpy の sort または argsort を使用できます。たとえば、2 番目の列から並べ替えインデックスを取得できます。

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

したがって、このサイズの配列の場合、実際には問題にならないことがわかります。

于 2013-01-21T12:36:54.883 に答える