Python:从具有相同X和Y坐标的X、Y、Z文件中删除所有重复点的方法
我正在寻找一种方法来删除所有重复点从一个X,Y,Z文件。我想编码的是删除具有相同x和y坐标的点。第一个点保留下来,所有后续重复项都将被删除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,
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(…)
,因为您以交互方式运行代码。正常运行时,将不会看到任何打印内容。