3

假设我有一个像这样的 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 函数来执行此操作或一些自定义的单线来执行此类任务?

4

2 回答 2

3

我不太确定您是如何存储日期的;您给出的示例实际上不起作用,因为日期将被解释为算术。但是,如果您有一个特定的日期date想要嵌套数组,您可以通过索引轻松获取它:

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

这将选择您想要的日期的每一行,然后只给您数字。如果您希望在每个日期都这样做,您可以使用以下内容:

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

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

于 2013-06-06T01:00:05.250 回答
0

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

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

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

于 2016-04-03T18:31:15.770 回答