簡體   English   中英

根據一列中的值拆分numpy recarray

[英]Split numpy recarray based on value in one column

我的真實數據有大約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']),我得到了所有可能的元值的列表。

我想根據“元”列將其分成較小的列表。 理想情況下,我想要以下結果:

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'))

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

盡管對於大型數據集,前者在內存上更好。 關於如何進行拆分的任何想法? 我在這里看到了其他一些問題,但是它們都在測試數值。

您始終可以使用花式索引輕松訪問這些行:

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數據框。 它們具有功能分組 ,可以完全執行您描述的任務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM