Gia*_*ear 1 python arrays numpy list 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, 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)
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的帮助和提示!!!:)
当您寻求帮助和提示时:
我建议的第一件事是,您应该避免循环遍历 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
Run Code Online (Sandbox Code Playgroud)
因此,对于 500000 个数据点,pandas 比 with 快三到四倍,比 withOrderedDict快六倍groupby。
| 归档时间: |
|
| 查看次数: |
4385 次 |
| 最近记录: |