gpt4 book ai didi

python - 如何定义一个元素属于其他类别?

转载 作者:太空宇宙 更新时间:2023-11-04 10:10:17 26 4
gpt4 key购买 nike

我知道这个题目很难理解,但我不知道如何用一句话描述我的问题...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上但是有3种标签

[1,1]

只属于一个类别,所以我想在0和1中间加一个切点x=0.5。

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

但是喜欢

[1,1] and [2,1]

它们都只有一个相同的label,这里不需要加切点。

所以结果应该是[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

最佳答案

这是您遇到的一个奇怪的问题,但这是一种实用的方法。

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]

关于python - 如何定义一个元素属于其他类别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38758367/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com