保留订单的numpy.unique

sia*_*mii 32 python numpy

['b','b','b','a','a','c','c']
Run Code Online (Sandbox Code Playgroud)

numpy.unique给出

['a','b','c']
Run Code Online (Sandbox Code Playgroud)

如何保留原始订单

['b','a','c']
Run Code Online (Sandbox Code Playgroud)

很棒的答案.奖金问题.为什么这些方法都不适用于此数据集?http://www.uploadmb.com/dw.php?id=1364341573这是numpy排序奇怪行为的问题

HYR*_*YRY 55

unique() 很慢,O(Nlog(N)),但您可以通过以下代码执行此操作:

import numpy as np
a = np.array(['b','a','b','b','d','a','a','c','c'])
_, idx = np.unique(a, return_index=True)
print(a[np.sort(idx)])
Run Code Online (Sandbox Code Playgroud)

输出:

['b' 'a' 'd' 'c']
Run Code Online (Sandbox Code Playgroud)

Pandas.unique() 对于大数组O(N)来说要快得多:

import pandas as pd

a = np.random.randint(0, 1000, 10000)
%timeit np.unique(a)
%timeit pd.unique(a)

1000 loops, best of 3: 644 us per loop
10000 loops, best of 3: 144 us per loop
Run Code Online (Sandbox Code Playgroud)

  • 它在这里提到:http://www.slideshare.net/fullscreen/wesm/a-look-at-pandas-design-and-development/41 (3认同)
  • @F Lekschas,pandas.unique()似乎保留默认顺序 (2认同)
  • @HYRY - 链接已损坏,需要删除“/fullscreen”:https://www.slideshare.net/wesm/a-look-at-pandas-design-and-development/41 (2认同)

Fre*_*Foo 17

使用的return_index功能np.unique.返回元素首次出现在输入中的索引.然后,argsort这些索引.

>>> u, ind = np.unique(['b','b','b','a','a','c','c'], return_index=True)
>>> u[np.argsort(ind)]
array(['b', 'a', 'c'], 
      dtype='|S1')
Run Code Online (Sandbox Code Playgroud)


YXD*_*YXD 7

a = ['b','b','b','a','a','c','c']
[a[i] for i in sorted(np.unique(a, return_index=True)[1])]
Run Code Online (Sandbox Code Playgroud)

  • 这只是已接受答案的较慢版本 (2认同)