【问题标题】:Splitting a list of integers by breaks in the data when the break size is variable and the list of integers is not consecutive in python?当中断大小可变并且整数列表在python中不连续时,通过数据中的中断拆分整数列表?
【发布时间】:2015-09-02 15:57:53
【问题描述】:

我正在使用 python 中的 GPS 跟踪数据,并尝试通过在收集 GPS 点之间经过的时间间隔来拆分 GPS 跟踪文件。我已将所有时间值转换为整数,现在我正在处理整数列表。整数不是连续的,可以间隔 1、2、3、4 或 5 秒,但仍被视为同一 GPS 轨迹的可行数据。但是,有些文件的数据块相隔数百秒 - 在这种情况下,我想将整数列表拆分为两个单独的文件(最终代表两个单独的行程)。

我一直在使用以下代码进行基本测试:

    import numpy as np

    a = [0, 47, 48, 49, 50, 97, 98, 99]

    def consecutive(data, stepsize=1):
        return np.split(data, np.where(np.diff(data) != stepsize)[0]+1)

    b = np.array(a)
    print consecutive(b)

>>>
[array([0]), array([47, 48, 49, 50]), array([97, 98, 99])]

如果实际数据中的步长始终为 1,这将起作用 - 但是,它们不是。我尝试在列表中插入适当的最大步长,但得到以下结果:

import numpy as np

a = [0, 47, 49, 51, 54, 97, 99, 101, 104, 107, 108, 356, 357, 358]

def consecutive(data, stepsize=5):
    return np.split(data, np.where(np.diff(data) != stepsize)[0]+1)

b = np.array(a)
print consecutive(b)

>>>
[array([0]), array([47]), array([49]), array([51]), array([54]), array([97]), array([99]), array([101]), array([104]), array([107]), array([108]), array([356]), array([357]), array([358])]

每个数字都是一个单独的列表,因为没有一个步长等于 5。

我尝试通过以下方式编辑此工作脚本以考虑可变步长,但由于语法无效而出现错误:

import numpy as np

a = [0, 47, 49, 51, 54, 97, 99, 101, 104, 107, 108, 356, 357, 358]

def consecutive(data, stepsize<5):
    return np.split(data, np.where(np.diff(data) != stepsize)[0]+1)

b = np.array(a)
print consecutive(b)

错误说

我可能遗漏了一些基本的东西,但感谢我当前定义/使用的功能之外的任何建议或其他解决方法。

我还要感谢那些在此链接中提供另一个问题答案的人:how to find the groups of consecutive elements from an array in numpy?,因为它帮助我开始了。

【问题讨论】:

  • 你真的应该格式化你的代码。
  • 请看这里如何格式化你的代码块:meta.stackexchange.com/questions/22186/…
  • 感谢您的建议 - 这是我第二次发帖。代码现在应该被适当地格式化了。

标签: python list numpy gps


【解决方案1】:
np.split(a, np.where(np.diff(a) > 5)[0]+1)

产量

[array([0]), array([47, 48, 49, 50]), array([97, 98, 99])]

所以只需将您的功能更改为:

def consecutive(data, stepsize=5): 
    return np.split(data, np.where(np.diff(data) > stepsize)[0]+1)

更新以合并更大的样本量

a = [0, 47, 49, 51, 54, 97, 99, 101, 104, 107, 108, 356, 357, 358]
np.split(a, np.where(np.diff(a) > 5)[0]+1)

得到这个答案:

[array([0]),
 array([47, 49, 51, 54]),
 array([ 97,  99, 101, 104, 107, 108]),
 array([356, 357, 358])]

这就是你要找的吗?

【讨论】:

  • 是的 - 谢谢!看这个太久了,对我的监督。感谢简单的修复。
猜你喜欢
  • 2016-01-08
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
相关资源
最近更新 更多