基于一列中的值拆分numpy重新排列

时间:2014-05-30 23:02:56

标签: python numpy recarray

我的真实数据有10000多个项目。我有一个复杂的numpy记录数组,格式大致如下:

a = (((1., 2., 3.), 4., 'metadata1'), 
     ((1., 3., 5.), 5., 'metadata1'), 
     ((1., 2., 4.), 5., 'metadata2'),
     ((1., 2., 5.), 5., 'metadata2'),  
     ((1., 3., 8.), 5., 'metadata3'))

我的列由dtype = [('coords', '3f4'), ('values', 'f4'), ('meta', 'S10')]定义。我通过set(a ['meta'])获得了所有可能元值的列表。

我想基于'meta'列将其拆分为更小的列表。理想情况下,我喜欢这样的结果:

a['metadata1'] == (((1., 2., 3.), 4.), ((1., 3., 5.), 5.))
a['metadata2'] == (((1., 2., 4.), 5.), ((1., 2., 5.), 5.))
a['metadata3'] == (((1., 3., 8.), 5.))

a[0] = (((1., 2., 3.), 4., 'metadata1'), ((1., 3., 5.), 5., 'metadata1'))
a[1] = (((1., 2., 4.), 5., 'metadata2'), ((1., 2., 5.), 5., 'metadata2'))
a[2] = (((1., 3., 8.), 5., 'metadata3'))

或任何其他方便拆分的格式。

虽然对于大型数据集,前者在内存上更好。有关如何拆分的任何想法?我在这里看到了其他一些问题,但他们都在测试数值。

1 个答案:

答案 0 :(得分:2)

您始终可以使用精美的索引轻松访问这些行:

In [34]: a[a['meta']=='metadata2']
Out[34]: 
rec.array([(array([ 1.,  2.,  4.], dtype=float32), 5.0, 'metadata2'),
           (array([ 1.,  2.,  5.], dtype=float32), 5.0, 'metadata2')], 
          dtype=[('coords', '<f4', (3,)), ('values', '<f4'), ('meta', 'S10')])

您可以使用此方法为不同的元类型创建查找字典:

meta_dict = {}
for meta_type in np.unique(a['meta']):
    meta_dict[meta_type] = a[a['meta']==meta_type]

如果存在大量元类型,这将是非常低效的。

更有效的解决方案可能是使用Pandas数据框。它们具有group by功能,可完全执行您描述的任务。

相关问题