2016-08-04 21 views
1

我知道這個話題真的很難理解,但我不知道如何用一句話來形容我的問題...... T^T如何定義一個元素屬於其他類別?

這是我正在嘗試做的。

我有一組一維點在三個類別。

A = [[0,1], [0,2], [0,3], [1,1], [2,1], [3,2], [3,3], [4,2], [4,3], [5,3], [6,3]] 

第一個數字是x座標和第二數量中的每個[]

標籤和欲切割點插入到每對相鄰點[X1,L1],[X2,L2的],如果其中至少一個具有多於一種標籤,L2屬於與L1不同的類別。

例如,

[0,1], [0,2], [0,3] 

他們都在X = 0,但有三種標籤

[1,1] 

只屬於一個類別,所以我想補充一個切點在0中間X = 0.5和1.

3 x 
2 x 
1 x 1 
    x 
0-x-1- 

但像

[1,1] and [2,1] 

他們都只有一個和相同的標籤,沒有必要在這裏添加一個切點。

所以結果應該是 [0.5, 2.5, 3.5, 4.5] ,也許看起來像這樣

3 x  x 3 x 3 x 3 3  <--Label 
2 x  x 2 x 2 x   <--Label 
1 x 1 1 x x x   <--Label 
    x  x x x   
-0-x-1---2-x-3-x-4-x-5---6--- <--X-axis 
    0.5  2.5 3.5 4.5   <--Cut points 

我想寫遺囑的代碼看起來是這樣的形式

A = [[0,1], [0,2], [0,3], [1,1], [2,1], [3,2], [3,3], [4,2], [4,3], [5,3], [6,3]] 
X = [] 
for a in A: 
    X.append(a[0]) 
X = sorted(list(set(X))) 

labels = [[1], [2], [3]] 
group = [] 
for i in range(len(labels)): 
    group.append([]) 

for a in A: 
    for i in range(3): 
     if a[1] in labels[i]: 
      group[i].append(a[0]) 

cutpoints = [] 

for i, x in enumerate(X): 
    for j in range(len(group)): 
     if x in group[j] and (X[i+1] in group[ other than j ]): 
      cutpoints.append((x+X[i+1])/2) 

但我停留在部分「其他比j「 在這種情況下,只有3類,所以也許我可以手動做,但我正在尋找一個更聰明的方式來做到這一點,所以我不需要每次遇到具有不同數量類別的新數據。

有什麼功能可以用來做「j以外的操作」嗎?

如有任何意見或問題,我們將不勝感激。 預先感謝T^T

+0

順便說一下,您有一個整數除法問題。 – bpachev

回答

2

這是一個奇怪的問題,但這裏有一個功能的方法。

from itertools import groupby 

groupby會讓我們輕易合併你的X座標,假設它們陣列預排序。

l = [(i, [x[1] for x in g]) for i, g in groupby(A, lambda x: x[0])] 

這看起來有點令人生畏,但在概念上相當簡單。該groupby拉在一起都共享一個X的事,與內部列表理解只是轉儲x值出:

l 

[(0, [1, 2, 3]), 
(1, [1]), 
(2, [1]), 
(3, [2, 3]), 
(4, [2, 3]), 
(5, [3]), 
(6, [3])] 

然後如果我們組使用zip下一個元素每一起我們就可以挑選出對符合您的標準並獲得它們之間的中點:

[(i1+i2)/2. 
for (i1, l1), (i2, l2) 
in zip(l, l[1:]) 
if l1 != l2 or len(l1) > 1] 

[0.5, 2.5, 3.5, 4.5] 
+0

真棒,完成了2行的一切!!!!!!!!!十分感謝 (_ _) – Chu

2

您可以使用沒有,像這樣:X[i+1] not in group[j]

其次,你的算法似乎過於複雜。這是什麼東西?

A = [[0,1], [0,2], [0,3], [1,1], [2,1], [3,2], [3,3], [4,2], [4,3], [5,3], [6,3]] 
point, label = A[0] 
cuts = [] 
for npoint, nlabel in A[1:]: 
    if not npoint == point: 
    if not label == nlabel: 
     cuts.append((point+npoint)/2.) 
    point = npoint 
    label = nlabel 
+0

嗯,也許我的例子不夠好TT – Chu

+0

發佈的代碼是否工作(我猜想假設A是排序的)? – bpachev

+0

X [i + 1]不在組[j]中的結果是[0.5,2.5,4.5] 並且您的代碼的結果是[0.5,2.5,3.5] 但是,您是對的,即使我自己不' t喜歡我發佈的代碼lol 感謝您的幫助〜 – Chu

相關問題