1

我正在寻找一种从 aa 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)

在此先感谢您的帮助和提示!!!:)

4

4 回答 4

5

当您寻求帮助和提示时:

我建议的第一件事是,您应该避免循环遍历 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 比 with 快三到四倍,比 with 快OrderedDict大约六倍groupby

于 2012-10-03T13:16:52.320 回答
1

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

from collections import OrderedDict

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

mypoints = tmp.values()

除了过滤之外,这还保留了随机序列的顺序。


另一个收据可以在 Python 文档中找到,可以翻译成如下内容:

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])
于 2012-10-02T22:08:15.633 回答
1

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

于 2012-10-02T22:15:28.820 回答
0

只是对 """C2H5OH""" 提出的代码稍作改动,以避免在视频上打印

from collections import 
from collections import OrderedDict
for point in zip(x, y, z):
... a = tmp.setdefault(point[:2], point)
... 
mypoints = tmp.values()
于 2012-10-02T22:48:40.073 回答