[英]How to calculate intersection points between two lines where one of them is defined by dataframe columns
我有以下数据框:
pd.DataFrame.from_dict({
'x0': {
199: 162.2, 441: 324.5, 903: 209.0, 1272: 241.4, 1431: 142.4, 1510: 314.7, 1657: 274.1,
1777: 217.7, 1811: 261.8, 2022: 143.0, 2164: 341.6, 2167: 364.7, 2461: 348.2, 2606: 256.7,
2895: 353.2, 114: 249.8, 240: 181.1, 278: 191.6, 372: 249.2, 460: 87.8
},
'y0': {
199: 246.8, 441: 55.4, 903: 236.0, 1272: 233.6, 1431: 230.6, 1510: 249.4, 1657: 67.7,
1777: 239.3, 1811: 193.7, 2022: 224.0, 2164: 101.6, 2167: 50.3, 2461: 191.9, 2606: 242.3,
2895: 200.4, 114: 51.5, 240: 104.9, 278: 132.5, 372: 167.0, 460: 207.2
},
'x1': {
199: 201.8, 441: 363.6, 903: 258.1, 1272: 257.0, 1431: 122.4, 1510: 331.0, 1657: 358.7,
1777: 265.0, 1811: 365.9, 2022: 176.8, 2164: 383.9, 2167: 351.1, 2461: 364.0, 2606: 300.0,
2895: 352.4, 114: 278.1, 240: 233.3, 278: 171.6, 372: 219.5, 460: 156.8
},
'y1': {
199: 240.2, 441: 114.6, 903: 236.0, 1272: 275.3, 1431: 286.6, 1510: 237.4, 1657: 178.2,
1777: 244.4, 1811: 100.6, 2022: 273.7, 2164: 154.5, 2167: 184.2, 2461: 127.5, 2606: 244.1,
2895: 115.1, 114: 85.0, 240: 117.4, 278: 84.1, 372: 159.2, 460: 199.5
}
})
x0 y0 x1 y1
199 162.2 246.8 201.8 240.2
441 324.5 55.4 363.6 114.6
903 209.0 236.0 258.1 236.0
1272 241.4 233.6 257.0 275.3
1431 142.4 230.6 122.4 286.6
1510 314.7 249.4 331.0 237.4
...
其中后续列定义线段的开始和结束坐标。 我需要计算该线段和线的交点,例如x = 100
和y = 60
。 我想将获得的点存储在x1
和y1
列中,以便在存在交集时替换这些值,否则将保留原始x1
和y1
值。 我发现在此链接下定义交点的解决方案,但我不知道如何对其进行矢量化并使其与 Pandas 一起使用。 或者,也许直接在列上工作会更容易? 有任何想法吗?
如果将数据转换为斜率截距格式,则可以轻松实现/矢量化此问题:
slopes = (df['y1'] - df['y0']) / (df['x1'] - df['x0'])
y_intercepts = df['y0'] - (slopes * df['x0'])
然后你的拦截问题可以解决任何行:
def get_vertical_intercept(x):
return slopes * x + y_intercepts
def get_horizontal_intercept(y):
return (y - y_intercepts) / slopes
至于替换 daframe 值:
intercepts = get_horizontal_intercept(256)
intercepts[np.isinf] = df['x1']
df['x1'] = intercepts.round(1)
可以想象,其他列可以类似地填充......
>>> df
x0 y0 x1 y1
199 162.2 246.8 107.0 240.2
441 324.5 55.4 457.0 114.6
903 209.0 236.0 258.1 236.0
1272 241.4 233.6 249.8 275.3
1431 142.4 230.6 133.3 286.6
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.