![](/img/trans.png)
[英]How can I calculate the distances of a set of 3d points with each other using python?
[英]How can i select equal distances points from a set of points using python
假設一個點或節點列表。 它們中的每一個都有 xy 和 z 坐標。 兩點 i 和 j 之間的距離等於D(i,j)= sqrt((xi-xj)^2+(yi-yj)^2+(zi-zj)^2)
。 在這里,我得到了 400000 個數據點。
現在,我想選擇一組這些節點之間的距離相等(之前指定了間距 --> 0.05)。 因此,選定的點是均勻分布的。
如果使用 while 循環運行,完成整個數據集大約需要 3 小時。 尋找最快的方法。
no_rows = len(df)
i = 1
while i < no_rows:
a1 = df.iloc[i-1, 1]
a2 = df.iloc[i, 1]
b1 = df.iloc[i-1, 2]
b2 = df.iloc[i, 2]
c1 = df.iloc[i-1, 3]
c2 = df.iloc[i, 3]
dist = np.round(((a2-a1)**2+(b2-b1)**2+(c2-c1)**2)**0.5,5)
df.iloc[i, 6]= dist
if dist < 0.05000:
df = df.drop(i)
df.reset_index(drop = True, inplace = True)
no_rows = len(df)
i = i-1
i+=1
編輯
一種選擇是直接使用熊貓並將數據幀合並到自身上。 就像是 :
import pandas as pd
import numpy as np
df = pd.DataFrame([
[131.404866,16.176877,128.120177 ],
[131.355045,16.176441,128.115972 ],
[131.305224,16.176005,128.111767 ],
[131.255403,16.175569,128.107562 ],
[131.205582,16.175133,128.103357 ],
[131.158858,16.174724,128.099413 ],
[131.15576,16.174702,128.09916 ],
[131.105928,16.174342,128.095089 ],
[131.05988,16.174009,128.091328 ],
[131.056094,16.173988,128.09103 ],
[131.006249,16.173712,128.087107 ],
[130.956404,16.173436,128.083184],
],
columns=['x', 'y', 'z']
)
df.reset_index(drop=False, inplace=True)
dist = 0.05
df['CROSS'] = 1
df = df.merge(df, on="CROSS")
df.reset_index(drop=True, inplace=True)
df['distance'] = np.round(
np.sqrt(
np.square(df['x_x'] - df['x_y'])
+ np.square(df['y_x']-df['y_y'])
+ np.square(df['z_x']-df['z_y'])
),
5
)
#drop values where distances are = 0 (same points)
ix = df[df.distance==0].index
df.drop(ix, inplace=True)
print('These are all pair of points which are matching the distance', dist)
ix = df[df.distance.astype(float)==dist].index
df.sort_values('distance', inplace=True)
print(df.loc[ix])
print('-'*50)
points = pd.DataFrame(
df.loc[ix, ['index_x', 'x_x', 'y_x', 'z_x']].values.tolist()
+ df.loc[ix, ['index_y', 'x_y', 'y_y', 'z_y']].values.tolist(),
columns=['index', 'x', 'y', 'z'])
points.drop_duplicates(keep='first', inplace=True)
print('These are all the points which have another at distance', dist)
print(points)
Numpy 的函數比任何循環都要快得多,並且允許您同時處理整個數據集。
另一種可能是使用 geopandas(它也可以非常快,但我不確定這里會是這種情況:最快的方法涉及 pyproj 的距離計算(用 C 編寫),我認為在3D)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.