使用numpy将数据分组为时间相关集

时间:2015-02-21 22:44:48

标签: python arrays numpy pandas

给定一组2D数据[时间,价值]我想把它分成相似的组但是按时间排序的块。我已经使用了numpy和pandas,所以这两种方法都很棒。

原件:

Foo = np.array([[0,A],[1,A],[2,A],[3,B],[4,B]
               [5,A],[6,A],[7,B],[8,B],[9,B],[10,A]....]])

分成:

bar = np.array([[0,A],[1,A],[2,A]])
baz = np.array([[3,B],[4,B]])
qux = np.array([[5,A],[6,A]])
arr = np.array([[7,B],[8,B],[9,B]])
wiz = np.array([[10,A],......]])

1 个答案:

答案 0 :(得分:1)

假设您的AB是值,您可以使用itertools.groupby,如果您的分组逻辑是将每个值的连续序列放入不同的情况基团。

具体(包括修复示例代码中的括号和逗号错误,并为AB添加一些虚拟值):

A = 1.0
B = 2.0
Foo = np.array([[0,A],[1,A],[2,A],[3,B],[4,B],
               [5,A],[6,A],[7,B],[8,B],[9,B],[10,A]])

from itertools import groupby
groups = [np.array(list(v)) for k,v in groupby(Foo, lambda x: x[1])]

现在,您呼叫的bar将是groups[0],依此类推。如果你想自动给他们起名字,建议你不要尝试使用某种locals()globals()技巧在顶层做这个,而只是列出名字并使用{{ 1}}:

dict

现在names = ['bar', 'baz', 'qux', 'arr', 'wiz'] named_groups = {names[i]:groups[i] for i in range(len(groups))} 会返回您刚刚调用named_groups['bar']的内容。

或者,如果您可以保证组的确切数量,您可以使用bar解压缩将它们全部命名为:

tuple

(注意:我never gotten a great answer关于PEP 8可能会说什么需要在 left 方面解压缩需要很多(可能是详细命名的)元组元素的最佳实践(bar, baz, qux, arr, wiz) = [np.array(list(v)) for k,v in itertools.groupby(Foo, lambda x: x[1])]

这仍然允许您将组绑定到顶级变量名称,但正确地强制您明确有多少这样的变量,避免尝试动态分配变量的不良做法。