查找列表中每个分类器的平均坐标

Find the average co-ordinates for each classifier in a list

我想编写一个接受两个输入的函数:

points是坐标点列表and;

classiification 是 n×m 长度的 1 或 0 列表,其中 n 是 points 中值的个数,m 是分类数。

该函数将 return 分配给每个分类的坐标的平均值。示例中有 2 个分类,points 中的每个坐标只能分配给一个分类(标记为 1,所有其他标记为 0)。

示例如下:

points = np.array([[1,1], [2,4], [4,6], [5,6], [6,6]])
classification = np.array([[1, 0],[1, 0],[0, 1],[0, 1],[0, 1]])
my_func(points, classification) #--> np.array([[1.5 , 2.5],
                                #              [5. , 6. ]])

所以第一个点 (1,1) 已分配给第一个分类器 (1,0),第三个点 (4,6) 已分配给第二个分类器 (0,1)。

解决这个问题的最佳方法是什么? 谢谢

  1. 创建两个数组,resultcount,都以分类数作为它们的大小,将每个值初始化为[0, 0] for result和0 for count .
  2. 取下一个点并分类,直到还剩none
  3. 使用 classification.index(1) 查找 resultcount 数组的索引
  4. 将点的值加到对应的result上并增加对应的count
  5. 重复步骤 2
  6. 将结果中的每个值除以它对应的 count
  7. return result

我会留给你为它编写代码。

因为字典是对涉及映射的数据进行操作的最简单方法。我用字典来解决你的问题。

points = np.array([[1,1], [2,4], [4,6], [5,6], [6,6]])
classification = np.array([[1, 0],[1, 0],[0, 1],[0, 1],[0, 1]])

我在下面的步骤中将列表列表转换为元组列表,因为列表由于其可变的性质而不能充当字典的键。

classification =[tuple(i) for i in classification]
dic={}
for i,j in zip(classification,points):
    if i not in dic.keys():
        dic[i]=[list(j)]
    else:
        dic[i].append(list(j))
[[sum(elem)/len(elem) for elem in zip(*j)] for i,j in dic.items()]

希望对您有所帮助。