An alternative to using a clustering method would be to try one of the nonlinear filters. In this case, the `MeanShiftFilter` might be useful: ListPlot[MeanShiftFilter[Flatten[cloudList, 1], 500, 0.5]] ![enter image description here][1] This uses a sliding window approach and finds all the points in the neighborhood and then averages only those within the 0.5 radius. While this doesn't give you exact values, presumably you could quantize the resulting small blobs without too much trouble. [1]: https://i.sstatic.net/2HsSY.png