当前位置: 首页 > 知识库问答 >
问题:

Python:不仅基于值,而且基于其他参与者的最小距离对来选择单个最小距离对

姚智
2023-03-14

例如,我有两个实体列表和一个测量它们之间距离的函数。假设是姓名和电子邮件。在下面的表格中,我测量了每封电子邮件到每个名字的距离。

    1@ - {A:0.2, B:0.3, C:0.4, D:0.6}
    2@ - {A:0.15, B:0.2, C:0.2, D:0.5}
    3@ - {A:0.1, B:0.05, C:0.03, D:0.2}

现在我想在名称中找到每个电子邮件的最小距离对。但是,请注意,如果两封电子邮件具有相同的最小距离名称候选人,则赢得距离最小的人。在这种情况下,另一个电子邮件应该选择第二接近的候选名称,并再次检查。

因此,在这种情况下,结果应为:

    1@: B  
    2@: A
    3@: C

解释表:

速度很重要。。它可以以数据帧或dicts的形式进行处理,这无关紧要<谢谢你的帮助。

UPD:

当电子邮件的数量

共有1个答案

林正平
2023-03-14

假设您拥有此数据帧:

  emails/names     A     B     C    D
0           1@  0.20  0.30  0.40  0.6
1           2@  0.15  0.20  0.20  0.5
2           3@  0.10  0.05  0.03  0.2

然后:

df = df.set_index("emails/names")
numpy_df = df.to_numpy()

forbidden_rows, forbidden_cols = [], []
while len(forbidden_rows) != len(df):
    row, col = np.unravel_index(numpy_df.argmin(), df.shape)
    numpy_df[:, col] = np.inf
    numpy_df[row, :] = np.inf
    forbidden_rows.append(df.index[row])
    forbidden_cols.append(df.columns[col])

for r, c in zip(forbidden_rows, forbidden_cols):
    print(r, c)

印刷品:

3@ C
2@ A
1@ B

编辑:首先将数据帧转换为numpy.ndarray

编辑:要打印未分配的电子邮件:

对于这个数据框:

  emails/names     A     B     C    D
0           1@  0.20  0.30  0.40  0.6
1           2@  0.15  0.20  0.20  0.5
2           3@  0.10  0.05  0.03  0.2
3           4@  0.10  0.05  0.03  0.2
4           5@  0.11  0.25  0.43  0.2
5           6@  0.12  0.35  0.53  0.3

这:

df = df.set_index("emails/names")
numpy_df = df.to_numpy()

forbidden_rows, forbidden_cols = [], []
while len(forbidden_rows) != len(df) and len(forbidden_cols) != len(df.columns):
    row, col = np.unravel_index(numpy_df.argmin(), df.shape)
    numpy_df[:, col] = np.inf
    numpy_df[row, :] = np.inf
    forbidden_rows.append(df.index[row])
    forbidden_cols.append(df.columns[col])

for r, c in zip(forbidden_rows, forbidden_cols):
    print(r, c)

print("Unassigned emails:")
print(df.index[~df.index.isin(forbidden_rows)].values)

印刷品:

3@ C
4@ B
5@ A
6@ D
Unassigned emails:
['1@' '2@']
 类似资料:
  • 我有一个多边形类型的几何体,我正在计算一个点的最小距离可能在多边形几何体内部(由360个点组成,作为闭合几何体)或多边形几何体外部。使用postgis的ST_distance方法,当点在几何体外部时,我得到精确的距离,但如果点在几何体内部,则得到0作为距离,我想要与多边形几何体最近点的点之间的最小距离,无论该点位于几何体内部还是外部。

  • 问题: 这是LeetCode的问题: 给定一个整数数组,返回所有对之间的 k 个最小距离。一对(A,B)的距离定义为A和B之间的绝对差。 例子: 我的问题 我用一个简单的方法解决了它O(n^2),基本上我找到所有的距离并对其进行排序,然后找到第k个最小的。现在这是一个更好的解决方案。这不是我的代码,我在leetcode的讨论论坛上找到了它。但是我很难理解代码的关键部分。 下面的代码基本上是在做一个

  • 问题内容: 我有一个一维数字数组,想计算所有成对的欧几里得距离。我有一种方法(感谢SO)在广播中执行此操作,但是它效率低下,因为它两次计算每个距离。而且它的伸缩性不好。 这是一个示例,它为我提供了1000个数字的数组。 我可以使用scipy / numpy / scikit-learn中最快的实现来执行此操作,因为它必须扩展到一维数组具有> 10k值的情况。 注意:矩阵是对称的,所以我猜想通过解决

  • 注意:矩阵是对称的,所以我猜测,通过寻址它,至少有可能获得2倍的加速,我只是不知道如何实现。

  • 我对任何逻辑都是新手,希望执行以下任务。我在GIS环境中有几种类型的固定代理,希望通过网络将它们连接起来。连接的条件如下:让代理类型A有4个代理,代理类型B有20个代理。我想根据最短(直线)距离连接B和A。也就是说,B型代理将连接到最近的A型代理。 非常感谢。

  • 假设我有一个包含整数的数组。 如何找到大小的子集,使得子集中所有整数对之间的距离,我的意思是它们在最远的距离。 示例:数组和, ,最小距离为10和6之间的<错误的子集: ,最小距离为 ,最小距离为 我想到了一个解决办法: 1) 排序数组2)选择一个[0],现在在数组中查找ceil(a[0])=Y。。。。然后ceil(Y