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

Group data into time dependent sets using numpy

给定一组二维数据 [Time, Value] 我想将其分成类似的组,但按时间顺序排列。我已经在使用 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],......]])

假设你的意思是 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() 技巧来做到这一点,而只是列出名称并使用 dict:

names = ['bar', 'baz', 'qux', 'arr', 'wiz']
named_groups = {names[i]:groups[i] for i in range(len(groups))}

现在named_groups['bar']returns你以前叫什么bar

或者,如果你能保证组的精确数量,你可以使用tuple解包一步命名它们:

(bar,
 baz,
 qux,
 arr,
 wiz) = [np.array(list(v)) for k,v in itertools.groupby(Foo, lambda x: x[1])]

(注意:我已经 never gotten a great answer 关于 PEP 8 可能会说的关于需要有很多(可能命名冗长)元组元素在 left[ 上解包的最佳实践=43=] =)

一侧

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