1

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関数とインデックスを使用して、ポイントを並べ替え、重複を削除する必要があります。

パンダ(numpyの上に構築されている)には、C2H5OHによって提案されているように、配列をループしてポイントを取得するよりも高速なメソッドがDataFrames組み込まれています。drop_duplicates

あなたはそれらを使用して比較することができます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のデータポイントを使用すると、パンダはを使用した場合よりも3〜4倍高速になり、。OrderedDictを使用した場合よりも約6倍高速になりgroupbyます。

于 2012-10-03T13:16:52.320 に答える
1

これらのポイントを並べ替えて、同じ X と Y を持つポイントを検出することができます。

于 2012-10-02T22:15:28.820 に答える
1

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()

フィルタリングとは別に、これはランダム シーケンスの順序も保持します。


別の領収書は 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 に答える
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 に答える