2017-06-02 63 views
0

我讀了這個question並適應了我的目的。我想用它們的數字對花車進行分組。在相鄰的數字之間應該小於1,但組中的第一個和最後一個可以大於1.將附近的浮動物列表編組,將其視爲在np.array的附近位置

數組無法排序。如果兩個值之間的差值小於1,但它們在陣列中的位置彼此遠離,則它們必須處於不同的組中。

我從這段代碼得到了錯誤的結果。

d = np.array([[100.1,100.6,101.1,500,500.3,500.6,500.9,44.1,44.2,101.9,102.1],[40,41]]) 

ans = [] 
for i in range(d.size):  
    m = [[d[i][0]]]  
    for x in d[i][1:]: 
     if x - m[-1][0] < 1: 
      m[-1].append(x) 
     else: 
      m.append([x]) 
    ans.append(m) 
print ans 
>>[[[100.1, 100.6], [101.1], [500, 500.3, 500.6, 500.9, 44.1, 44.2, 101.9, 102.1]], [[40], [41]]] 

預期ANS應

[[[100.1, 100.6, 101.1], [500, 500.3, 500.6, 500.9], [44.1, 44.2],[101.9, 102.1]], [[40], [41]]]] 

我幹了什麼錯在這裏做什麼?

+0

提示:'np.sort',一旦'D'排序,執行算法應該更簡單高效:) – NiziL

回答

2

如果你是開放的另一種更有效的解決方案,下面是一個使用NumPy的的np.split -

[np.split(i, np.flatnonzero(np.abs(np.diff(i))>=1)+1) for i in d] 

採樣運行 -

In [83]: d 
Out[83]: 
array([[100.1, 100.6, 101.1, 500, 500.3, 500.6, 500.9, 44.1, 44.2, 101.9, 102.1], 
     [40, 41]], dtype=object) 

In [84]: [np.split(i, np.flatnonzero(np.abs(np.diff(i))>=1)+1) for i in d] 
Out[84]: 
[[array([ 100.1, 100.6, 101.1]), 
    array([ 500. , 500.3, 500.6, 500.9]), 
    array([ 44.1, 44.2]), 
    array([ 101.9, 102.1])], 
[array([40]), array([41])]] 
+0

這太棒了!非常感謝。只是想知道是否有辦法獲得每個陣列的大小?現在'len(output)'是2.我正在尋找像'(array1,4),(array2,2)' – Jan

+1

@Jan'list(map(len,out))'',其中'out'是從提出的解決方案中輸出。 – Divakar