【问题标题】:argsort on a PyTables' arrayPyTables 数组上的 argsort
【发布时间】:2015-08-31 13:28:26
【问题描述】:

我对 NumPy 的 argsort 有疑问。它在内存中创建一个长度为输入数组长度的 int64 数组。由于我正在处理非常大的数组,这会占用内存。

我用一个小的 PyTables 数组测试了 NumPy 的 argsort,它给出了正确的输出。现在,我想要的是排序算法直接使用 PyTables 的数组。有没有办法通过标准的 NumPy 调用或简单地破解 NumPy 内部来做到这一点?

我也对非 NumPy 替代方案持开放态度 - 我只是想完成工作!

【问题讨论】:

    标签: python arrays numpy pytables


    【解决方案1】:

    由于您使用的是 Pytables,我建议您使用内置排序的 Table 类。

    %pylab
    
    import tables
    #create description of your table
    class Table_Description(tables.IsDescription):
        column_name = tables.Int64Col()   
    
    #create hdf5 file and table
    f=tables.open_file('test.h5',mode="w")
    a=f.create_table("/","my_table",description=Table_Description)
    
    # fill table
    a.append(array([randint(0,99999) for i in xrange(10000)]))
    
    #Create a full index (on disk if you use the tmp_dir parameter
    a.cols.column_name.create_index(9,kind='full',tmp_dir="/tmp/")
    
    #write changes to disc
    a.flush()
    
    #read indices that will sort the table
    ind=f.root.my_table.cols.column_name.index
    ind.read_indices()
    

    【讨论】:

    • 这对我来说非常适合。这有效地回答了我提出的问题,因此我将其标记为这样。我将始终以块和顺序的方式访问列(前 N 个排序的行,然后是第二个,依此类推)。为此,有没有办法让列就地排序以避免许多 read_sorted 调用?
    • 有可能。然而据我所知,我一直在解决这个问题,你必须首先创建一个完整的索引,然后以排序的方式复制表。但是,只有在您执行 1 次写入/复制然后从同一个表中进行大量读取时,这才值得。如果您不复制完整表,则使用 read_sorted 的访问将使用完整索引加速。您将不得不使用参数(块大小等...)来优化您的用例的性能。
    • 我尝试了您的建议(复制原始表格)。我有一个 3 字段,1.52 亿行数据集。复制整个内容需要 15 分钟,顺序加载数据需要 1 秒。使用未排序表中的 read_sort 加载整个数据需要 13 分钟。因此,对于仅 1 次传递数据(我的使用),不值得进行排序副本。仅供参考,我将 chunksize 保留为自动计算的。
    猜你喜欢
    • 2013-12-05
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    相关资源
    最近更新 更多