【问题标题】:Vectorising max distance function向量化最大距离函数
【发布时间】:2021-12-18 05:57:06
【问题描述】:

非常快速的问题,

我有以下距离函数

def distance(a1,a2,b1,b2):
     return sqrt((a2-a1)**2 + (b2-b1)**2)

我想计算数据框中 A 列中每个点与 B 列之间的距离,并将最大值保存在 C 列中。

现在我在嵌套循环中遍历每个并使用 distance(df.loc[i, colA], dftest.loc[i,colB], dftest.loc[j,colA], dftest.loc[j .colB]) 并检查是否大于以前。 我知道有一种方法可以对其进行矢量化,只是无法理解。

我不需要任何现成的功能,但请明确如何矢量化它。

感谢您的帮助!

编辑: 数据框示例,其中 colB 是所需的输出:

ColA| ColB| ColC
7.6 |8.2  |6.79 (max distance which is between this row and row3)
6.6 |4.4  |3.92 (max distance is with row1, greater than row3)
4.4 |2.2  |6.79 (max distance is with row1)

因此,例如第一行中的 ColC 是用距离(7.6,8.2,4.4,2.2)计算的,但函数 distnace 必须遍历所有组合

更大的 dfs 变得非常昂贵

【问题讨论】:

  • 那么您的columnA 在每个单元格中有2 个坐标?
  • 请提供您的数据框示例
  • @QuangHoang 不,这些是带有常规浮点数的 2 列。它现在的工作方式,对于 df.iloc[0, columnA] 它遍历整个 B 列并保存最大值,然后转到 df.iloc[1,columnA] 并重复。现在有 O(n^2)
  • @mozway ColA 和 ColB 有浮点数,colC 将是最大距离。行取决于数据集
  • 使用distance_matrix...

标签: python pandas numpy vectorization


【解决方案1】:

既然你不想使用库,你可以使用底层的numpy数组,广播矢量计算并获取最大值:

import numpy as np
a = df.values  # easier reference to numpy array
b = (a[:,0]-a[:,0,None])**2+(a[:,1]-a[:,1,None])**2  # (a2-a1)**2 + (b2-b1)**2
df['ColC'] = np.sqrt(b.max(0))

输出:

   ColA  ColB      ColC
0   7.6   8.2  6.800000
1   6.6   4.4  3.929377
2   4.4   2.2  6.800000

【讨论】:

  • 这是一个了不起的解决方案,非常感谢!我现在正在尝试分解您的代码并弄清楚您是如何对其进行切片的,这真的很有帮助
  • 这其实很简单,关键是使用[…, None]的广播增加了一个额外的维度来比较所有的行组合。
  • 嗯,有道理,再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-20
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 2022-06-16
相关资源
最近更新 更多