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

Python:从具有相同X和Y坐标的X、Y、Z文件中删除所有重复点的方法,python,arrays,list,numpy,matplotlib,Python,Arrays,List,Numpy,Matplotlib,我正在寻找一种方法来删除所有重复点从一个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,

我正在寻找一种方法来删除所有重复点从一个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)
提前感谢您的帮助和提示!!!
:)

如果运行Python2.7或更高版本,可以使用
orderedict
作为过滤器:

from collections import OrderedDict

tmp = OrderedDict()
for point in zip(x, y, z):
    tmp.setdefault(point[:2], point)

mypoints = tmp.values()
除了过滤之外,这还保留了随机序列的顺序


可以找到另一个receipie,它可以翻译为:

from itertools import groupby

keyfunc = lambda p: p[:2]
mypoints = []
for k, g in groupby(sorted(zip(x, y, z), key=keyfunc), keyfunc):
    mypoints.append(list(g)[0])

如果运行Python 2.7或更高版本,则可以使用
OrderedDict
作为过滤器:

from collections import OrderedDict

tmp = OrderedDict()
for point in zip(x, y, z):
    tmp.setdefault(point[:2], point)

mypoints = tmp.values()
除了过滤之外,这还保留了随机序列的顺序


可以找到另一个receipie,它可以翻译为:

from itertools import groupby

keyfunc = lambda p: p[:2]
mypoints = []
for k, g in groupby(sorted(zip(x, y, z), key=keyfunc), keyfunc):
    mypoints.append(list(g)[0])

您可以尝试对这些点进行排序,并检测具有相同X和Y的点。按X排序,然后按Y排序,或者反之亦然。

您可以尝试对这些点进行排序,并检测具有相同X和Y的点。按X排序,然后按Y排序,或者反之亦然。

为了避免在视频上打印,只需对“C2H5OH”提出的代码进行一个小改动

from collections import 
from collections import OrderedDict
for point in zip(x, y, z):
... a = tmp.setdefault(point[:2], point)
... 
mypoints = tmp.values()

只是对“C2H5OH”提出的代码做了一个小改动,以避免在视频上打印

from collections import 
from collections import OrderedDict
for point in zip(x, y, z):
... a = tmp.setdefault(point[:2], point)
... 
mypoints = tmp.values()

当您请求帮助和提示时:

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

(它构建在numpy之上)
DataFrames
有一个内置的
drop\u 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
的六倍,因为您需要帮助和提示:

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

(它构建在numpy之上)
DataFrames
有一个内置的
drop\u 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
的六倍。您已经向我们展示了如何生成这些点,但没有展示您尝试过如何过滤它们。请更改您的答案选择。我没有注意到您使用的是
numpy
,因此我的示例不是最佳解决方案。您向我们展示了如何生成这些点,但没有展示您尝试如何过滤这些点。请更改您的答案选择。我没有注意到您使用的是
numpy
,因此我的示例不是最佳解决方案。您可以同时按X和Y排序,方法是将它们组成一个元组。这是因为
sort
是稳定的,任何具有相同键的元素都将保持其原始顺序。通过创建它们的元组,您可以同时按X和Y进行排序。这是因为
sort
是稳定的,任何具有相同键的元素都将保持其原始顺序。我要指出的是,在阅读@Mark_Ransom关于稳定排序的评论后,我提出了第二种解决方案。-1因为你不应该在不告诉OP的情况下建议numpy数组的循环,通常矢量化函数和索引将是处理numpy数组的方法。当然,我没有注意到
import numpy
行。我会在OP选择你的答案后立即删除。如果你愿意更新你的答案,这就足够了。但是,还有一些行包含
numpy
;-)我只是想指出,在阅读了@Mark_Ransom关于稳定排序的评论后,我提出了第二个解决方案。-1因为你不应该在不告诉OP的情况下为numpy数组提供循环建议,通常向量化函数和索引是处理numpy数组的方法。当然,我没有注意到
导入numpy
行。我会在OP选择你的答案后立即删除。如果你愿意更新你的答案,这就足够了。但是,还有一些行包含
numpy
;-)您看到了返回值
tmp.setdefault(…)
,因为您以交互方式运行代码。当您正常运行它时,您将不会看到任何打印内容。您看到了返回值
tmp.setdefault(…)
,因为您以交互方式运行代码。正常运行时,将不会看到任何打印内容。