Python 使用numpy将数据分组到时间相关的集合中
给定一组2D数据[时间,值],我想将其分成类似的组,但按时间顺序分块。我已经在使用numpy和pandas了,所以无论哪种方法都很好 原件:Python 使用numpy将数据分组到时间相关的集合中,python,arrays,numpy,pandas,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
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],......]])
假设您的意思是将
A
和B
作为值,如果分组逻辑是将每个值的连续序列放入不同的组中,则可以使用itertools.groupby
具体而言(包括修复示例代码中的括号和逗号错误,并为a
和B
添加一些伪值):
现在,您所称的条将是组[0]
,依此类推。如果您想自动为他们命名,建议不要尝试在顶层使用某种locals()
或globals()
技巧,而是列出名称并使用dict
:
names = ['bar', 'baz', 'qux', 'arr', 'wiz']
named_groups = {names[i]:groups[i] for i in range(len(groups))}
现在,named_groups['bar']
返回您过去只调用的bar
或者,如果您可以保证组的精确数量,您可以使用tuple
unpacking在一个步骤中命名所有组,如下所示:
(bar,
baz,
qux,
arr,
wiz) = [np.array(list(v)) for k,v in itertools.groupby(Foo, lambda x: x[1])]
(注意:关于需要在=
左侧解包大量(可能是详细命名的)元组元素的最佳实践,我已经讨论了PEP 8可能会说些什么。)
这仍然允许您将组绑定到顶级变量名,但正确地强制您明确此类变量的数量,避免尝试动态分配变量的错误做法。是否假定A
和B
为字符串或实际值?你能为他们提供一个示例值吗?如果它们是值,请注意,最终结果不会打印出来,因为它位于底部:将显示A
或B
的实际值,而不是它们的符号变量名称。参数是否忽略某些集合?例如,如果迭代发现其他值C(是的,这些都是数值),跳过它,继续只对A和B进行分组。也许更好的问题是,我从哪里可以了解如何操纵这种野兽。我们是否创建了一个列表?3D numpy阵列?我不知道该研究什么。。我可以访问每个单独的数组,如组[0],但我有120个数组要操作,我只知道如何手动访问它们。如果您有一个名为x
的对象,您可以使用type(x)
检查它是什么类型,然后从那里开始。如果您有一个列表
,为什么不将处理逻辑编写为一个单独的函数,将单个组作为参数,然后使用map
将其喷洒到组列表中?如果将数据存储为pandas
DataFrame
,则可以将a
/B
列的值设置为索引,或按该列分组(这与上面的连续运行分组逻辑稍有不同,这就是为什么我在回答中选择不使用pandas
)。。。有很多可能性。
(bar,
baz,
qux,
arr,
wiz) = [np.array(list(v)) for k,v in itertools.groupby(Foo, lambda x: x[1])]