Numpy表 - 高级多标准选择

时间:2011-03-19 00:50:48

标签: python numpy selection

我有一张类似这样的表:

IDs    Timestamp     Values

124    300.6          1.23
124    350.1         -2.4
309    300.6          10.3
12     123.4          9.00
18     350.1          2.11
309    350.1          8.3

       ...

我想选择属于一组ID的所有行。我知道我可以做类似

的事情
table[table.IDs == 124]

选择所有一个ID的行,我可以

table[(table.IDs == 124) | (table.IDs == 309)]

获取两个ID的行。但是想象一下,我有~100,000行,超过1,000个唯一ID(与行索引不同),我想选择与一组10个ID匹配的所有行。 直觉上我想这样做:

# id_list: a list of 10 IDs
table[ table.IDs in id_list ]

但是Python拒绝这种语法。我能想到的唯一方法就是做到以下几点:

table[ (table.IDs == id_list[0]) |
       (table.IDs == id_list[1]) |
       (table.IDs == id_list[2]) |
       (table.IDs == id_list[3]) |
       (table.IDs == id_list[4]) |
       (table.IDs == id_list[5]) |
       (table.IDs == id_list[6]) |
       (table.IDs == id_list[7]) |
       (table.IDs == id_list[8]) |
       (table.IDs == id_list[9]) ]

对我来说似乎非常不优雅 - 代码太多而且不同长度的列表没有灵活性。 有没有解决我的问题的方法,例如使用列表推导或.any()函数? 任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:7)

你可以这样做:

subset = table[np.array([i in id_list for i in table.IDs])]

如果您有更新版本的numpy,可以使用in1d功能使其更紧凑:

subset = table[np.in1d(table.IDs, id_list)]

另请参阅此问题:numpy recarray indexing based on intersection with external array

答案 1 :(得分:0)

这是一个可能比任何python for循环更快地分析的解决方案。但是,我认为它不会比in1d做得更好。仅当您能够承担ids.size table.IDs.sizeids的临时2D整数数组时才使用它。在这里,id_listresult = table[~np.all(table.IDs[None]-ids[None].T, 0)] 的numpy数组。

{{1}}