使用numpy将数组分组到嵌套结构

时间:2013-06-06 00:33:03

标签: python arrays numpy

假设我有一个像这样的numpy数组(每个日期更大且重复次数不同):

data = np.array([              \
   ["2011-01-01", 24, 554, 66],  \
   ["2011-01-01", 44, 524, 62],  \
   ["2011-01-04", 23, 454, 32],  \
   ["2011-01-04", 22, 45,  42],  \
   ["2011-01-04", 14, 364, 12]   \
])

现在我想按日期将列分组为更扁平的结构:

[              
   ["2011-01-01", [[24, 554, 66], [44, 524, 62]]],
   ["2011-01-04", [[23, 454, 32], [22, 45, 42], [14, 364, 12]]]  
]

我确实知道如何通过循环遍历我的数组并附加元素来实现它,但这对我来说似乎非常简单。是否有一些内置的numpy函数来执行此操作或某些自定义单行程序用于此类任务?

2 个答案:

答案 0 :(得分:3)

我不太确定你是如何存储日期的;您提供的示例实际上不起作用,因为日期将被解释为算术。但是,如果您希望嵌套数组具有特定日期date,则可以轻松地通过索引编制它:

data[ data[:,0]==date, 1: ]

这将选择包含所需日期的每一行,然后仅为您提供数字。如果您希望每个日期使用此日期,则可以使用以下内容:

[ [ date, data[ data[:,0]==date, 1: ] ] for date in np.unique(data[:,0]) ]

请注意,这将为嵌套列表部分提供一个numpy数组,但如果您希望它作为普通列表,转换它将很容易。

答案 1 :(得分:0)

这是典型的分组问题,可以使用numpy_indexed包有效解决(免责声明:我是作者):

import numpy_indexed as npi
unqiue, groups = npi.group_by(data[:,0], data[:, 1:].astype(np.int))

虽然目前接受的答案并不优雅,但它具有二次性能。这个解决方案是nlogn,并避免任何python循环;因此更多&numpythonic' :)