Skip to main content
 首页 » 编程设计

Python:从具有相同 x 和 y 坐标的 X、Y、Z 文件中删除所有重复点的方法

2025年05月04日19duanxz

我正在寻找一种从 X、Y、Z 文件中删除所有重复点的方法。我希望编码的是删除具有相同 x 和 y 坐标的点。第一个点保留下来,所有后续的重复项都被删除。

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.mlab as ml 
import matplotlib.delaunay 
from matplotlib.mlab import griddata 
 
# my area boundary box 
xmax, xmin, ymax, ymin = 640000.06, 636999.83, 6070000.3, 6066999.86 
 
# generate fake data 
ndata = 500000 
# Generate random data to simulate 
x = np.random.randint(xmin, xmax, ndata) 
y = np.random.randint(ymin, ymax, ndata) 
z = np.random.randint(0,20,ndata) 
mypoints = zip(x,y,z) 

提前感谢您的帮助和提示!!! :)

请您参考如下方法:

当您寻求帮助和提示时:

我建议的第一件事是,你应该避免循环遍历 numpy 数组,因为这是低效的,而且 numpy 数组不是为此设计的。如果您使用的是 numpy 数组,则应使用矢量化 numpy 函数和索引对点进行排序并删除重复项。

Pandas (它建立在 numpy 之上)DataFrames 有一个内置的 drop_duplicates 方法,它应该比 C2H5OH 提议的通过遍历数组来获取你的点更快。

您可以使用 ipython 比较它们:

import pandas as pd 
from collections import OrderedDict 
from itertools import groupby  
 
def with_ordered_dict(x, y, z):         
    tmp = OrderedDict() 
    for point in zip(x, y, z): 
        tmp.setdefault(point[:2], point) 
    return tmp.values() 
 
def with_groupby(x, y, z):         
    keyfunc = lambda p: p[:2] 
    mypoints = []                              
    for k, g in groupby(sorted(zip(x, y, z), key=keyfunc), keyfunc): 
        mypoints.append(list(g)[0]) 
    return mypoints 
 
def with_dataframe(x, y, z): 
    df = pd.DataFrame({'x':x, 'y':y, 'z':z}) 
    return df.drop_duplicates(cols=['x', 'y']) 
 
In [140]: %timeit mypoints = with_ordered_dict(x, y, z) 
1 loops, best of 3: 2.47 s per loop 
 
In [141]: %timeit mypoints = with_groupby(x, y, z) 
1 loops, best of 3: 4.22 s per loop 
 
In [142]: %timeit mypoints = with_dataframe(x, y, z) 
1 loops, best of 3: 713 ms per loop 

因此,对于 500000 个数据点,pandas 比使用 OrderedDict 快三到四倍,比使用 groupby 快大约六倍。