Python 按最后一个值拆分元组的np数组,但仅当元组的其余部分匹配时

Python 按最后一个值拆分元组的np数组,但仅当元组的其余部分匹配时,python,arrays,numpy,tuples,Python,Arrays,Numpy,Tuples,我有一个很长的三维元组数组: array([('Session A', 'mov1', 1932), ('Session A', 'mov1', 1934), ('Session A', 'mov1', 1936), ..., ('Session B', 'mov99', 5306), ('Session B', 'mov99', 5308), ('Session B', 'mov99', 5310)], dtype=object) 每个元组的第一个和第二个值来自一

我有一个很长的三维元组数组:

array([('Session A', 'mov1', 1932), ('Session A', 'mov1', 1934),
       ('Session A', 'mov1', 1936), ..., ('Session B', 'mov99', 5306),
       ('Session B', 'mov99', 5308), ('Session B', 'mov99', 5310)], dtype=object)
每个元组的第一个和第二个值来自一个小集合:

first_values = set('Session A', 'Session B')
second_values = set('mov1', 'mov2', 'mov3', ... , 'mov100')
但第三个值可以是任何正整数。 我正在寻找一种很好的Pythonic方法,将原始数组拆分为单独的元组数组,其中:

所有元组对于第一个和第二个参数都具有相同的值。 每个连续元组的第三个参数之间的差值不大于给定值delta 例如:

delta = 5
data = [('Session A', 'mov1', 1000), ('Session A', 'mov1', 1001), ('Session A', 'mov1', 1003), ('Session A', 'mov1', 1007), ('Session A', 'mov1', 1010), ('Session A', 'mov1', 1050), ('Session A', 'mov1', 1052), ('Session A', 'mov2', 1002), ('Session A', 'mov2', 1004)]

*magical python function*

result = [
    [('Session A', 'mov1', 1000), ('Session A', 'mov1', 1001), ('Session A', 'mov1', 1003), ('Session A', 
    'mov1', 1007), ('Session A', 'mov1', 1010)], 
    [('Session A', 'mov1', 1050), ('Session A', 'mov1', 1052)],
    [('Session A', 'mov2', 1002), ('Session A', 'mov2', 1004)]
]

我找到了,但这不是我需要的。有什么建议吗?

您可以通过使用itertools按每个元组的前两个元素对数据进行分组,然后在第三个元素的值变化超过增量时循环这些结果以分解列表来实现您想要的。这可以通过以下方式实现:

import itertools

delta = 5
data = [
    ('Session A', 'mov1', 1000), ('Session A', 'mov1', 1001),
    ('Session A', 'mov1', 1003), ('Session A', 'mov1', 1007),
    ('Session A', 'mov1', 1010), ('Session A', 'mov1', 1050),
    ('Session A', 'mov1', 1052), ('Session A', 'mov2', 1002),
    ('Session A', 'mov2', 1004)
]

result = []
for key, group in itertools.groupby(data, key = lambda x: (x[0],x[1])):
    work = []
    prev = None
    for elem in list(group):
        if (prev is not None) and (elem[2] - prev > delta):
            result.append(work)
            work = []
        work.append(elem)
        prev = elem[2]
    result.append(work)

数据是一个列表,而不是顶部显示的对象数组。是的,因为它是假的数据。如果它能让您感觉更好,我可以将其转换为数组,不会更改所需的功能,但np.arraydata也与start不同。这是一个2d数组字符串数据类型。是什么让解决方案成为“优秀的pythonic”?如果python代码运行,这是否足够?NumPy与此有什么关系?