我有一个pd数据帧,它在XY平面上有很多平面。数据帧由点的x和y坐标组成。我想使用毕达哥拉斯定理检查每个点到所有其他点的距离,并计算该点一定距离内的点数。
def distance(x1, y1, x2, y2):
return math.sqrt((x1 - x2)**2 + (y1 - y2)**2)
df = pd.DataFrame({'X':[random.randint(1,100) for i in range(100)], 'Y':[random.randint(1,100) for i in range(100)]})我意识到我可以遍历数据帧,但这不是最佳实践,而且耗时太长。有没有办法优化这个过程。
最终,我希望在数据帧中有另一列,用于存储数据帧中每个点在特定距离内的点数。
编辑:我正在尝试做的另一件事是在XY平面中寻找在给定半径内具有最多点数的任意点(或区域)。我的基本意思是,我还想查看平面中的位置,这些位置不一定是数据帧中的点,但仍然在平面的限制内。
发布于 2020-10-20 08:52:35
如果你想让你的代码使用pandas和numpy快速运行,你应该试着习惯编写看起来只处理数字的函数,但实际上你可以输入numpy数组/pandas序列。例如,如果你想在df中找到距离cx, cy点不超过r的所有点,你可以这样做
def close_to_my_point(x,y):
return (x-cx)**2+(y-cy)**2 <= r**2
close_to_my_point(df["X"],df["Y"])这为您提供了一系列布尔值,指示您在数据帧中该位置的点现在是否接近cx, cy。现在请注意,当对True,False值求和时,True的行为类似于1,而False的行为类似于0。所以sum(close_to_my_point(df["X"],df["Y"]))在某一点上做了你想做的事情。
对于默认情况下不能应用于系列的函数,可以使用np.vectorize进行更改。把所有这些放在一起,你就会得到一些东西,可以非常快速地计算出某个距离的点数:
def disk_equation(cx,cy,r):
return lambda x,y: (x-cx)**2+(y-cy)**2<= r**2
points_in_distance = lambda x,y: sum(disk_equation(x,y,20)(df["X"],df["Y"]))
df["points_closer_than_20"] = np.vectorize(points_in_distance)(df["X"],df["Y"])发布于 2020-10-20 08:20:52
在SciPy中包含了很多用于计算成对距离的工具:enter link description here
可以使用的最简单的方法是distance_matrix,它计算成对距离并将其作为矩阵返回。首先,您需要将数据帧转换为格式正确的numpy数组:
import random
from scipy.spatial import distance_matrix
import pandas as pd
import numpy as np
df = pd.DataFrame({'X':[random.randint(1,100) for i in range(100)], 'Y': random.randint(1,100) for i in range(100)]})
foo = np.array([(x,y) for x, y in zip(df.X, df.Y)])
baz = distance_matrix(foo, foo)这里我们使用了两次foo,因为我们想要数组中所有点的所有成对距离。
https://stackoverflow.com/questions/64436586
复制相似问题