我有一个x,y坐标的列表,我需要根据x坐标进行排序,然后在x相同时排序y坐标,并消除相同坐标的重复。例如,如果列表是:
[[450.0, 486.6], [500.0, 400.0], [450.0, 313.3], [350.0, 313.3], [300.0, 400.0],
[349.9, 486.6], [450.0, 313.3]]我需要重新安排它,以:
[[300.0, 400.0], [349.9, 486.6], [350.0, 313.3], [450.0, 313.3], [450.0, 486.6],
[500.0, 400.0]](删除了[450.0, 313.3]的一个副本)
发布于 2018-06-21 09:41:03
无论如何,这是列表列表的正常排序顺序。使用字典进行重复数据删除。
>>> L = [[450.0, 486.6], [500.0, 400.0], [450.0, 313.3], [350.0, 313.3], [300.0, 400.0], [349.9, 486.6], [450.0, 313.3]]
>>> sorted({tuple(x): x for x in L}.values())
[[300.0, 400.0],
[349.9, 486.6],
[350.0, 313.3],
[450.0, 313.3],
[450.0, 486.6],
[500.0, 400.0]]发布于 2018-06-21 10:22:33
因为我们无论如何都要进行排序,所以可以使用groupby进行重复数据消除
>>> import itertools
>>> [k for k, g in itertools.groupby(sorted(data))]
[[300.0, 400.0], [349.9, 486.6], [350.0, 313.3], [450.0, 313.3], [450.0, 486.6], [500.0, 400.0]] 以下是几个计时:
>>> import numpy as np # just to create a large example
>>> a = np.random.randint(0, 215, (10000, 2)).tolist()
>>> len([k for k, g in groupby(sorted(a))])
8977 # ~ 10% duplicates
>>>
>>> timeit("[k for k, g in groupby(sorted(a))]", globals=globals(), number=1000)
6.1627248489967315
>>> timeit("sorted({tuple(x): x for x in a}.values())", globals=globals(), number=1000)
6.654527607999626
>>> timeit("sorted(unique(a, key=tuple))", globals=globals(), number=1000)
7.198703720991034
>>> timeit("np.unique(a, axis=0).tolist()", globals=globals(), number=1000)
8.848866895001265发布于 2018-06-21 10:52:45
使用numpy的unique函数似乎很容易实现您想要的功能:
import numpy as np
u = np.unique(data, axis=0) # or np.unique(data, axis=0).tolist()如果您真的担心数组不是按列排序的,那么除了上面的内容之外,还可以运行np.lexsort():
u = u[np.lexsort((u[:,1], u[:,0]))]计时(非随机样本):
In [1]: import numpy as np
In [2]: from toolz import unique
In [3]: data = [[450.0, 486.6], [500.0, 400.0], [450.0, 313.3],
...: [350.0, 313.3], [300.0, 400.0], [349.9, 486.6], [450.0, 313.3]]
...:
In [4]: L = 100000 * data
In [5]: npL = np.array(L)
In [6]: %timeit sorted(unique(L, key=tuple))
125 ms ± 1.72 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [7]: %timeit sorted({tuple(x): x for x in L}.values())
139 ms ± 3.41 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [8]: %timeit np.unique(L, axis=0)
732 ms ± 12.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [9]: %timeit np.unique(npL, axis=0)
584 ms ± 8.11 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
# @user3483203 solution:
In [57]: %timeit lex(np.asarray(L))
227 ms ± 8.34 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [58]: %timeit lex(npL)
76.2 ms ± 410 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)计时(更多随机样本):
当样本数据更随机时,结果会有所不同:
In [29]: npL = np.random.randint(1,1000,(100000,2)) + np.random.choice(np.random.random(1000), (100000, 2))
In [30]: L = npL.tolist()
In [31]: %timeit sorted(unique(L, key=tuple))
143 ms ± 2.35 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [32]: %timeit sorted({tuple(x): x for x in L}.values())
134 ms ± 1.14 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [33]: %timeit np.unique(L, axis=0)
78.5 ms ± 1 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [34]: %timeit np.unique(npL, axis=0)
54 ms ± 398 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
# @Paul Panzer's solution:
In [36]: import itertools
In [37]: %timeit [k for k, g in itertools.groupby(sorted(L))]
123 ms ± 3.42 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# @user3483203 solution:
In [54]: %timeit lex(np.asarray(L))
60.1 ms ± 744 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [55]: %timeit lex(npL)
38.8 ms ± 728 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)https://stackoverflow.com/questions/50959180
复制相似问题