给定一组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],......]])
答案 0 :(得分:1)
假设您的A
和B
是值,您可以使用itertools.groupby
,如果您的分组逻辑是将每个值的连续序列放入不同的情况基团。
具体(包括修复示例代码中的括号和逗号错误,并为A
和B
添加一些虚拟值):
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])]
)
这仍然允许您将组绑定到顶级变量名称,但正确地强制您明确有多少这样的变量,避免尝试动态分配变量的不良做法。