假设我有一个像这样的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函数来执行此操作或某些自定义单行程序用于此类任务?
答案 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' :)