簡體   English   中英

如何在python中最好將一維數組連續元素分組

[英]how to group 1D array consecutive elements in python preferably

我有以下一維數組:

[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軸求和。 較高的范圍組代表寫行,而較低的范圍組代表空白行。 這意味着,我想將圖像上的書面行和空白行分開。 因此有一種模式。 書寫線將具有相同的寬度,即它們的組長將相同。 由於背景噪聲,空白行可能會突然出現尖峰。 但總體而言,我可以手動看到空白行的模式。 我需要以編程方式。

在這種情況下,一種簡單的基於閾值的方法將起作用。

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]]

更復雜的方法可能涉及擬合分段常數模型或檢測統計不平穩性,但是通常最好堅持使用最簡單可行的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM