看起来按单个列对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创建索引数组,然后使用它对单个数组重新排序可能会更快。可以,除了我希望处理非常大的数组并且希望避免尽可能多地复制数据之外,这是可以的。有没有更有效的方式来做到这一点,而我所缺少的呢?

最佳答案

如Jaime所说,您可以使用argsort对记录数组进行排序。

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

并使用take避免进行复制
np.take(rec, inds, out=rec)

关于python - 排序numpy结构化和记录数组非常慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19682521/

10-11 23:14
查看更多