8

numpy の構造化されたレコード配列を単一の列で並べ替えると、同様のスタンドアロン配列で並べ替えるよりもはるかに遅くなるようです。

In [111]: a = np.random.rand(1e4)

In [112]: b = np.random.rand(1e4)

In [113]: rec = np.rec.fromarrays([a,b])

In [114]: timeit rec.argsort(order='f0')
100 loops, best of 3: 18.8 ms per loop

In [115]: timeit a.argsort()
1000 loops, best of 3: 891 µs per loop

構造化配列を使用するとわずかに改善されますが、劇的ではありません。

In [120]: struct = np.empty(len(a),dtype=[('a','f8'),('b','f8')])

In [121]: struct['a'] = a

In [122]: struct['b'] = b

In [124]: timeit struct.argsort(order='a')
100 loops, best of 3: 15.8 ms per loop

これは、argsort からインデックス配列を作成し、それを使用して個々の配列を並べ替えた方が潜在的に高速であることを示しています。非常に大きな配列を扱うことが予想され、データのコピーをできるだけ避けたい場合を除いて、これで問題ありません。私が見逃しているこれを行うためのより効率的な方法はありますか?

4

2 に答える 2

3

ハイメが言っargsortたように、レコード配列をソートするために使用できます。

inds = np.argsort(rec['f0'])

そしてtake、コピーの作成を避けるために使用します

np.take(rec, inds, out=rec)
于 2014-04-25T21:27:08.000 に答える