[英]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]
如果存在大量的元類型,這將是非常低效的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.