【问题标题】:how to group 1D array consecutive elements in python preferably如何最好在python中对一维数组连续元素进行分组
【发布时间】:2017-03-23 11:14:20
【问题描述】:

我有以下一维数组:

[0, 0, 0, 1, 0, 0, 16, 249, 142, 149, 189, 135, 141, 146, 294, 3, 2, 0, 3, 3, 6, 2, 3, 4, 21, 22, 138, 95, 86, 110, 72, 89, 79, 138, 14, 18, 18, 18, 12, 15, 21, 22, 11, 20, 26, 90, 62, 128, 94, 117, 81, 81, 137, 7, 13, 14, 6, 10, 8, 11, 10, 13, 21, 18, 140, 69, 147, 110, 112, 88, 100, 197, 9, 20, 5, 6, 5, 4, 7, 10, 21, 32, 42, 56, 41, 156, 95, 112, 81, 93, 152, 14, 19, 9, 12, 20, 18, 14, 21, 18, 18, 14, 91, 47, 43, 63, 41, 45, 43, 85, 15, 16, 14, 10, 11]

我可以看到尖峰所在的模式。所以我想把上面的数组分组如下:

[[0, 0, 0, 1, 0, 0, 16], [249, 142, 149, 189, 135, 141, 146, 294], [3, 2, 0, 3, 3, 6, 2, 3, 4, 21, 22], [138, 95, 86, 110, 72, 89, 79, 138]....so on]

我尝试使用 K 均值,即均值和标准偏差的某种组合。但是它们都没有导致这种分组。请帮忙!

编辑: 这些数据是沿 x 轴的灰度图像的暗像素值在 y 轴上的总和。较高范围组代表书写行,较低范围组代表空白行。这意味着,我想将图像上的书面行和空白行分开。所以有一个模式。书写的线条将具有相同的宽度,即它们的组长度将相同。由于背景噪音,空白行可能会突然出现尖峰。但总的来说,手动,我可以看到书面和空白行的模式。我想要它以编程方式。

【问题讨论】:

    标签: python numpy scipy python-imaging-library image-segmentation


    【解决方案1】:

    一种简单的基于阈值的方法将适用于这种情况。

    x = np.array([0, 0, 0, 1, 0, 0, 16, 249, 142, 149, 189, 135, 141, 146, 294, 3, 2, 
                  0, 3, 3, 6, 2, 3, 4, 21, 22, 138, 95, 86, 110, 72, 89, 79, 138, 14, 
                  18, 18, 18, 12, 15, 21, 22, 11, 20, 26, 90, 62, 128, 94, 117, 81, 
                  81, 137, 7, 13, 14, 6, 10, 8, 11, 10, 13, 21, 18, 140, 69, 147, 
                  110, 112, 88, 100, 197, 9, 20, 5, 6, 5, 4, 7, 10, 21, 32, 42, 56, 
                  41, 156, 95, 112, 81, 93, 152, 14, 19, 9, 12, 20, 18, 14, 21, 18, 
                  18, 14, 91, 47, 43, 63, 41, 45, 43, 85, 15, 16, 14, 10, 11])
    
    mask = x > 30  # Mark values above/below threshold
    
    cuts = np.flatnonzero(np.diff(mask))  # find indices where mask changes
    cuts = np.hstack([0, cuts + 1, -1])  # let indices point after the change and add beginning and end of the array.
    
    groups = []
    for a, b in zip(cuts[:-1], cuts[1:]):  # iterate over index pairs
        groups.append(x[a:b].tolist())
    print(groups)
    
    # [[0, 0, 0, 1, 0, 0, 16], [249, 142, 149, 189, 135, 141, 146, 294], [3, 2, 0, 3, 3, 6, 2, 3, 4, 21, 22], [138, 95, 86, 110, 72, 89, 79, 138], [14, 18, 18, 18, 12, 15, 21, 22, 11, 20, 26], [90, 62, 128, 94, 117, 81, 81, 137], [7, 13, 14, 6, 10, 8, 11, 10, 13, 21, 18], [140, 69, 147, 110, 112, 88, 100, 197], [9, 20, 5, 6, 5, 4, 7, 10, 21], [32, 42, 56, 41, 156, 95, 112, 81, 93, 152], [14, 19, 9, 12, 20, 18, 14, 21, 18, 18, 14], [91, 47, 43, 63, 41, 45, 43, 85], [15, 16, 14, 10]]
    

    更复杂的方法可能涉及拟合分段常数模型或检测统计不平稳性,但通常最好坚持使用最简单可行的方法。

    【讨论】:

    • 虽然大致解决了问题。评论会帮助我理解,因为我是新手,我会进一步说明我想要什么。这些数组值是 x 轴上的暗像​​素值在 y 轴上的总和。较高值组代表书写行,而较低值组代表空白行。所以,你看,必须有一个模式。书面行应等长。倒数第 4 组应该从 56 开始。更复杂的是,图像可能有背景噪音。所以我不会提前知道阈值“30”
    • @RahulKumar 我完全回答了你提出的问题。你应该更准确地陈述你的问题。 (例如,无法知道您希望倒数第 4 组如何,或者您事先知道什么以及不知道什么。)您可以edit 在此处包含您提供的其他信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多