【问题标题】:Sorting very large 1D arrays对非常大的一维数组进行排序
【发布时间】:2013-01-04 12:00:04
【问题描述】:

我即将第一次试用 Pytables,我需要在每个时间步将数据写入 hdf 文件。我将有超过 100,000 个时间步长。完成后,我想按第 2 列对我的 100,000+ x 6 数组进行排序,即,我目前已按时间排序所有内容,但现在我需要按降雨率递减的顺序对数组进行排序(第 2 列)。我不确定如何从这里开始。我知道将整个数组放在内存中是不明智的。任何想法如何快速有效地做到这一点?

感谢任何建议。

【问题讨论】:

  • Table.readSorted()Table.iterSorted() 有什么问题?顺便说一句,只要您的字段是数字(大约 5 MB),每行有 6 个字段的 100k 行并不多。
  • 我不知道这些排序功能。谢谢你的提示。我试试看。

标签: numpy pandas pytables


【解决方案1】:

我知道将整个数组放在内存中是不明智的。

你可能想多了。一个 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

【讨论】:

    【解决方案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
    

    所以你看到,对于这个大小的数组,它并不重要。

    【讨论】:

    • 谢谢。我想我可能低估了数组的大小。在时间索引超过 3.3 亿之前,我已经在 numpy 中完成了此操作。我忘了把它乘以纬度和孤度。此外,随着我​​处理水平分辨率越来越高的数据,尺寸也会增加。欣赏小费。我正在编写代码并调整我的旧 numpy 脚本。
    猜你喜欢
    • 1970-01-01
    • 2011-08-01
    • 2017-06-05
    • 2012-04-03
    • 1970-01-01
    • 2017-05-25
    • 2018-06-02
    • 2017-04-18
    • 1970-01-01
    相关资源
    最近更新 更多