Python 使用numpy将数据分组到时间相关的集合中

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

给定一组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],......]])

假设您的意思是将
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])]