0

我具有以下1D陣列:如何分組1D陣列中的連續蟒元件優選

[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意味着,均值和標準方差的某種組合。但他們都沒有導致這種分組。請幫忙!

編輯: 這些數據是灰度縮放圖像沿y軸總和的x軸的暗像素值之和。較高範圍組表示書寫線,較低範圍組表示空白線。這意味着,我想在圖像上分開書寫和空白行。所以有一種模式。書寫的線條寬度相同,即它們的長度將相同。由於背景噪音,空行可能會突然激增。但總的來說,手動,我可以看到一個寫和空行的模式。我想以編程方式。

回答

2

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

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

更復雜的方法可能涉及擬合分段常數模型或檢測統計instationarities,但通常這是最好的堅持與工作的最簡單可行的方法。

+0

雖然它大致解決了這個問題。評論會幫助我理解,因爲我是新手,我會進一步陳述我想要的內容。這些數組值是y軸上的x軸上的暗像​​素值的總和。較高的值組代表寫入的行,而較低的值組代表空白行。所以,你看,必須有一個模式。書面線應該是相等的長度。第四組最後一組應該從56開始。爲了進一步複雜化,圖像可能會有背景噪音。所以我不會提前知道門檻「30」 –

+1

@RahulKumar我完全回答了你問的問題。你應該更準確地陳述你的問題。 (例如,沒有辦法知道你想要第四個最後一組是什麼,或者你事先知道什麼,什麼不知道。)你可以[編輯](http://stackoverflow.com/posts/42974431/edit )包含您在此提供的附加信息。 – kazemakase