我有一個清單
x = [1,3,2,89,26,31,35,78,5,3,70]
我想要的是如下所示:
[[1,2,3,5], [26,31,35], [70,78,89]]
是否可以將關閉的整數元素從 python 中的整數串列中分組?
uj5u.com熱心網友回復:
我意識到你的問題是專門關于 numpy 的,但正如 Ben 指出的那樣,由你來決定閾值,這可能不容易做到。
在我看來,這聽起來像是一個基本的 kmeans 練習,您可以在其中設定組數并讓模型完成其余的作業。在此示例中,我選擇了 3 個集群來匹配您的輸出,但理想情況下,您可以使用肘部方法之類的方法來選擇最佳集群數量,以便您在組之間的分離是最好的。
from sklearn.cluster import KMeans
import numpy as np
from itertools import groupby
x = [1,3,2,89,26,31,35,78,5,3,70]
x = sorted(x)
kmeans = KMeans(n_clusters=3, random_state=0).fit(np.reshape(x,(-1,1)))
[[i[0] for i in list(d)] for g,d in groupby(list(zip(x,kmeans.labels_)), key=lambda x: x[1])]
輸出
[[1, 2, 3, 3, 5], [26, 31, 35], [70, 78, 89]]
編輯:
如果你想要一個功能:
def make_groups(data, n_groups):
from sklearn.cluster import KMeans
import numpy as np
from itertools import groupby
data = sorted(data)
kmeans = KMeans(n_clusters=n_groups, random_state=0).fit(np.reshape(data,(-1,1)))
return [[i[0] for i in list(d)] for g,d in groupby(list(zip(data,kmeans.labels_)), key=lambda x: x[1])]
x = [1,3,2,89,26,31,35,78,5,3,70]
make_groups(x, 3)
uj5u.com熱心網友回復:
對于預先指定thr的閾值,假設如果每個整數與組中的下一個整數的距離小于thr該組的下一個整數,則該組是“接近”的。在這個定義下,我們可以用下面的函式將關閉的數字組合在一起。
import numpy as np
def group(a,thr):
x = np.sort(a)
diff = x[1:]-x[:-1]
gps = np.concatenate([[0],np.cumsum(diff>=thr)])
return [x[gps==i] for i in range(gps[-1] 1)]
例如,group([1,3,2,89,26,31,35,78,5,3,70],20)回傳
[array([1, 2, 3, 3, 5]), array([26, 31, 35]), array([70, 78, 89])]
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/453048.html
上一篇:如何清理存盤在字典中的具有1到n個條件的熊貓資料框?
下一篇:按索引為二維陣列構建掩碼
