2012-10-17 7 views
16

परिणाम को सॉर्ट किए बिना मैं numpy अद्वितीय का उपयोग कैसे कर सकता हूं, लेकिन क्रम में वे अनुक्रम में दिखाई देते हैं? कुछ इस तरह?बिना किसी प्रकार के अनूठे अद्वितीय

a = [4,2,1,3,1,2,3,4]

np.unique(a) = [4,2,1,3]

बल्कि

से

np.unique(a) = [1,2,3,4]

उपयोग अनुभवहीन समाधान एक साधारण समारोह में लिखने के लिए ठीक होना चाहिए। लेकिन जैसा कि मुझे यह कई बार करने की ज़रूरत है, क्या ऐसा करने के लिए कोई तेज़ और साफ तरीका है?

उत्तर

30

आप return_index पैरामीटर के साथ ऐसा कर सकते हैं:

 
>>> import numpy as np 
>>> a = [4,2,1,3,1,2,3,4] 
>>> np.unique(a) 
array([1, 2, 3, 4]) 
>>> indexes = np.unique(a, return_index=True)[1] 
>>> [a[index] for index in sorted(indexes)] 
[4, 2, 1, 3] 
+0

हमेशा डॉक्स से जोड़ने के लिए उपयोगी: [numpy.unique] (https://docs.scipy.org/doc/numpy-1.13.0/ संदर्भ/जेनरेट/numpy.unique.html) – BoltzmannBrain

+0

हां यह अद्वितीय सूचकांक प्राप्त करता है, लेकिन सॉर्टिंग आवश्यक है? क्रमबद्ध करने के लिए पुनरावृत्तियों को समान वस्तुओं के लिए सरणी के माध्यम से खोजना ही होता है, इसलिए समय जटिलता से बचा नहीं जा सकता है। लेकिन numpy.unique एक नई सरणी वस्तु देता है। हम इस अंतरिक्ष जटिलता से बचने में सक्षम होना चाहिए। – BoltzmannBrain

4

आप कुछ इस तरह कर रही द्वारा numpy का उपयोग कर ऐसा कर सकता है, mergsort स्थिर है तो यह आप के प्रथम या अंतिम घटना बाहर लेने दूँगा प्रत्येक मूल्य:,

def unique(array): 
    uniq, index = np.unique(array, return_index=True) 
    return uniq[index.argsort()] 

लेकिन:

def unique(array, orderby='first'): 
    array = np.asarray(array) 
    order = array.argsort(kind='mergesort') 
    array = array[order] 
    diff = array[1:] != array[:-1] 
    if orderby == 'first': 
     diff = np.concatenate([[True], diff]) 
    elif orderby == 'last': 
     diff = np.concatenate([diff, [True]]) 
    else: 
     raise ValueError 
    uniq = array[diff] 
    index = order[diff] 
    return uniq[index.argsort()] 

इस उत्तर बहुत के समान है numpy.unique आंतरिक रूप से एक अस्थिर प्रकार का उपयोग करता है ताकि आपको कोई विशिष्ट इंडेक्स, यानी पहले या आखिरी बार प्राप्त करने की गारंटी न हो।

मुझे लगता है कि एक आदेश दिया dict भी काम कर सकते हैं:

def unique(array): 
    uniq = OrderedDict() 
    for i in array: 
     uniq[i] = 1 
    return uniq.keys() 
+0

आपके त्वरित उत्तर के लिए धन्यवाद। मैंने पहले के बारे में सोचा है, लेकिन मुझे यकीन नहीं है कि यह सबसे तेज़ है या नहीं। दूसरे को एक पायथन ऑब्जेक्ट को एक पायथन ऑब्जेक्ट में डालने से पीड़ित होना चाहिए :) – kuantkid

+0

'np.unique' के' return_index' तर्क का उपयोग करते हुए दूसरे 'अद्वितीय' के साथ समस्या है कि यह गलत परिणाम उत्पन्न कर सकता है? यह 'अद्वितीय' मूल अनुक्रम द्वारा लगाए गए आदेश का सम्मान न करने वाले कुछ तत्वों के साथ एक अनुक्रम लौटा सकता है, उदाहरण के लिए, (पूरी तरह से प्रदर्शन के लिए) 'अद्वितीय ([1,0,1]) -> [0, 1] '? –

+0

'np.unique' के दस्तावेज़ (http://docs.scipy.org/doc/numpy/reference/generated/numpy.unique.html) बताते हैं कि 'return_index = True' के साथ लौटाई गई इंडेक्स * पहले संकेत देगी * घटनाएं, इसलिए आपका दूसरा 'अद्वितीय' सुरक्षित और सही होना चाहिए, है ना? –

संबंधित मुद्दे