2016-08-04 88 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

相关问题