python - 对 numpy 结构化和记录数组进行排序非常慢

标签 python arrays sorting numpy

看起来按单列对 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 创建索引数组然后使用它重新排序各个数组可能会更快。这没关系,除了我希望处理非常大的数组并且希望尽可能避免复制数据。有没有一种我缺少的更有效的方法?

最佳答案

让你变慢的是 order 的使用,而不是你有一个记录数组的事实。如果要按单个字段排序,请按如下方式进行:

In [12]: %timeit np.argsort(rec['f0'])
1000 loops, best of 3: 829 us per loop

一旦使用了 order,无论您要按多少字段排序,性能都会下降:

In [16]: %timeit np.argsort(rec, order=['f0'])
10 loops, best of 3: 27.9 ms per loop

In [17]: %timeit np.argsort(rec, order=['f0', 'f1'])
10 loops, best of 3: 28.4 ms per loop

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

相关文章:

c++结构数组 - "This declaration has no storage class or type specifier"

javascript - 从 API 随机生成国家/地区名称

linq - 复杂对象上的 MvcContrib 网格排序

c++ - 如何在partial_sort_copy中使用operator>

python - 使用 keras 库指定 Dense

python - 如何删除 xarray.DataArray 的第一个元素?

python - 计算列值 python pandas

Python:包装递归函数

jquery - 创建一个数组并循环显示每个 HTML

algorithm - 当排序超集可用时对一组数字进行排序