按最后一个值拆分元组的np数组,但前提是元组的其余部分匹配



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

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')

但是第三个值可以是任何正整数
我正在寻找一种很好的Python方法来将原始数组拆分为元组的单独数组,其中:

  1. 所有元组的第一个&第二个论点
  2. 每个连续元组的第三个参数之间的差异不大于给定值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按每个元组的前两个元素对数据进行分组,然后在第三个元素的值变化超过delta时循环这些结果以分解列表来实现您想要的结果。这可以通过以下方式实现:

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)

最新更新