Numpy: python3: dtype पर अद्वितीय के लिए प्रतिगमन = अलग-अलग आइटम प्रकारों के साथ ऑब्जेक्ट सरणियाँ (Trac # 2188)

को निर्मित 19 अक्तू॰ 2012  ·  18टिप्पणियाँ  ·  स्रोत: numpy/numpy

_ऑरिजिनल टिकट http://projects.scipy.org/numpy/ticket/2188 2012-07-23 को @yarikoptic द्वारा, अज्ञात को सौंपा गया

वर्तमान मास्टर के खिलाफ परीक्षण किया गया (वर्तमान में 1.6.2 में भी):

अगर python2.x श्रृंखला के साथ यह ठीक काम करता है, बिना पुकिंग के:

$> python2.7 -c 'import numpy as np; print repr(repr(np.unique(np.array([1,2, None, "str"]))))' 
'array([None, 1, 2, str], dtype=object)'

नायब मैं यहाँ अलग रेपर पर एक बग रिपोर्ट करेंगे, तो अभी तक दर्ज नहीं

यह python3.x के साथ पूरी तरह से विफल रहता है:

$> python3.2 -c 'import numpy as np; print(repr(repr(np.unique(np.array([1,2,None, "str"])))))'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/local/lib/python3.2/dist-packages/numpy/lib/arraysetops.py", line 194, in unique
    ar.sort()
TypeError: unorderable types: int() > NoneType()

जब भी IMHO को सही ढंग से काम करना चाहिए - अद्वितीय () क्रिया का अर्थ तत्वों को क्रमबद्ध करने की क्षमता नहीं होनी चाहिए

00 - Bug numpy.core

सबसे उपयोगी टिप्पणी

इस पर कोई अपडेट? मुझे इस बग का सामना तब करना पड़ा जब पंडों पर डेटा-कॉलम के डीकाइप "ऑब्जेक्ट" और अनुपलब्ध मान के साथ scikit-learn's LabelEncoder का उपयोग करने का प्रयास किया गया

सभी 18 टिप्पणियाँ

इस मुद्दे पर कोई नया विचार?

unique लागू करने के लिए एकमात्र विकल्प हैं:

  • सरणी को सॉर्ट करना
  • सब कुछ एक हैश टेबल में रखना
  • सभी वस्तुओं पर सभी वस्तुओं के खिलाफ == तुलना करें

केवल छँटाई और हैशिंग की रणनीतियों में उचित गति होती है, और केवल छँटाई और सभी-विरोधी-सभी रणनीतियों के लिए अन्य मेमोरीज़ के लिए उचित मेमोरी ओवरहेड होती है। इसलिए मुझे लगता है कि हम फ़ॉलबैक विकल्पों को अद्वितीय में जोड़ सकते हैं जहां यदि छँटाई काम नहीं करती है तो यह अन्य रणनीतियों में से एक का प्रयास करता है? लेकिन OTOH एक फ़ंक्शन के लिए अच्छा नहीं है जो कभी-कभी अचानक बड़े पैमाने पर सीपीयू या मेमोरी लेता है जो आपके द्वारा दिए गए इनपुट के आधार पर होता है।

मुझे लगता है कि मैं एक पैच पर +1 करूँगा जो एक रणनीति = {"सॉर्ट", "हैश", "ब्रूटफोर्स"} विकल्प को np.unique में जोड़ता है, इसलिए अजीब डेटा वाले उपयोगकर्ता अपनी स्थिति के लिए समझ में आता है। अगर आप ऐसा लिखना चाहते हैं तो :-)

पहले तो मुझे आश्चर्य हुआ कि क्या यह असंगत वस्तुओं के लिए + हैश टेबल को छांट सकता है (यह नहीं जांच सकता कि क्या dtype ऑब्जेक्ट एरे के तत्वों को सॉर्ट करते समय तत्वों के cmp का उपयोग किया जाता है) इसलिए __cmp__ को सॉर्ट करना उन्हें पहले-पहले आ सकता है -फर्स्ट-इन-लाइन 'आदेश?
लेकिन तब एहसास हुआ कि यह अतुलनीय प्रकारों के लिए सामान्य रूप से राहत नहीं देता है, उदाहरण के लिए जब यह int और str का मिश्रण होता है ... तो मैंने सोचा कि अगर dtype = ऑब्जेक्ट के लिए यह पहले भाग लेने वाले dtypes और 'अद्वितीय को कम करने के लिए संभव हो सकता है '(संभवतः के माध्यम से) प्रत्येक dtype के भीतर संभवतः __cmp__ बिना dtypes के लिए हैश तालिकाओं पर निर्भर है?

सिर्फ उन लोगों के लिए जिन्हें वर्कअराउंड की आवश्यकता हो सकती है, यहां बताया गया है कि मैं इसे अपने मामले के लिए सेट में 'हैशिंग' के माध्यम से कैसे करता हूं:

$> python3.3 -c 'import numpy as np; print(np.array(list(set([1,2,"str", None])), dtype=object))' 
[None 1 2 'str']

यकीन नहीं होता कि आपने अभी क्या कहा :-)

लेकिन आगे सोचा छँटाई पर वास्तव में dtype = ऑब्जेक्ट के लिए विश्वसनीय नहीं है
वैसे भी। मैंने शायद दर्जनों कक्षाएं लिखी हैं जो ईक को ओवरराइड करती हैं
डिफ़ॉल्ट एलटी रखें , जिसका अर्थ है कि सॉर्ट-आधारित अद्वितीय बस होगा
चुपचाप गलत उत्तर लौटा दें। यह एक बहुत बुरा बग मुझे लगता है।

यदि ऑब्जेक्ट्स हैवी हैं, तो आप यूनिक प्राप्त करने के लिए सेट (गिरफ्तार) कर सकते हैं
तत्वों, लेकिन कोई गारंटी नहीं है कि वे सामान्य रूप से धो सकते हैं। (लेकिन कम से कम
हर किसी के लिए हैशटैग वस्तुओं के लिए यह _work_ होना चाहिए, जो सच नहीं है
छँटाई के लिए।) शायद यह एक बेहतर डिफ़ॉल्ट कार्यान्वयन होगा
ऑब्जेक्ट सरणियों के लिए np.unique

टीयू पर, 17 सितंबर, 2013 को शाम 5:40 बजे, यारोस्लाव हेलचेंको <
सूचनाएं@github.com> ने लिखा:

पहले तो मुझे आश्चर्य हुआ कि क्या यह असंगत के लिए हैश तालिका को क्रमबद्ध कर सकता है
आइटम्स (तत्व की छँटाई करते समय तत्वों की _cmp_ का उपयोग नहीं किया जाता है, यह जाँचें नहीं)
dtype object array) इसलिए cmp को सॉर्ट करना उन्हें पोजिशन कर सकता है
'पहले आओ-पहले पाओ' का आदेश?
लेकिन तब एहसास हुआ कि यह सामान्य रूप से राहत नहीं देता है
अतुलनीय प्रकार, उदाहरण के लिए जब यह int और str का मिश्रण है ... तो मुझे आश्चर्य हुआ
अगर dtype = ऑब्जेक्ट के लिए यह पहली बार भाग लेने के लिए संभव है
dtypes और 'यूनिक' (संभवत: सॉर्ट के माध्यम से) प्रत्येक dtype के भीतर संभवतः निर्भर करता है
सीएमपी बिना dtypes के लिए हैश तालिकाओं पर?

-
इस ईमेल का उत्तर सीधे दें या इसे Gi tHubhttps: //github.com/numpy/numpy/issues/641#issuecomment -24603047 पर देखें

gy ... ठीक है - पायथन में क्रूर विवरण:

def bucketed_unique(a):
    buckets = {}
    for x in a:
        t = type(x)
        if not (t in buckets):
            buckets[t] = bucket = []
        else:
            bucket = buckets[t]
        bucket.append(x)
    out = []
    for bucket in buckets.itervalues():
        # here could be actually set of conditions instead of blind try/except
        try:
            out.append(np.unique(bucket))
        except:
            out.append(np.array(list(set(bucket)), dtype=object))
    return np.hstack(out)
print bucketed_unique([1, 2, 'str', None, np.nan, None, np.inf, int])
[1 2 'str' None <type 'int'> nan inf]

सुनिश्चित बात - गैर-वस्तु ndarrays के लिए कोई 'बकेटिंग' नहीं किया जाना चाहिए

एल्गोरिथ्म का उपयोग == इसकी विशिष्टता की परिभाषा के रूप में नहीं करता है। की वस्तु
विभिन्न प्रकार = = हो सकते हैं। (आसान उदाहरण: 1, 1.0)। इसकी परिभाषा नहीं है
किसी भी मानक अजगर अवधारणा के अनुरूप।
17 सितंबर 2013 18:01 को, "यारोस्लाव हल्चेंको" सूचनाएं @github.com ने लिखा:

सुनिश्चित बात - गैर-वस्तु ndarrays के लिए कोई 'बकेटिंग' नहीं किया जाना चाहिए

-
इस ईमेल का उत्तर सीधे दें या इसे Gi tHubhttps: //github.com/numpy/numpy/issues/641#issuecomment -24604740 पर देखें

वास्तव में! यकीन है कि नहीं हो सकता है, लेकिन बाद में बाल्टी भर विश्लेषण हो सकता है समझ में आता है ... btw atm समस्या खुद को जटिल संख्याओं के साथ तुलना के लिए भी प्रकट करती है:

$> python3.3 -c 'import numpy as np; print(np.unique(np.array([1, 1.0, 1+0j], dtype=object)))'  
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib/python3/dist-packages/numpy/lib/arraysetops.py", line 194, in unique
    ar.sort()
TypeError: unorderable types: float() > complex()

$> python -c 'import numpy as np; print(np.unique(np.array([1, 1.0, 1+0j], dtype=object)))' 
[1]

हालांकि 2 के विचार पर - 'अद्वितीय' मान dtype तब सभी उपलब्ध विकल्पों (इंट / फ्लोट / कॉम्प्लेक्स) के बीच होना चाहिए? गैर-ऑब्जेक्ट सरणी के साथ यह स्पष्ट है ... विषम वस्तु सरणी के साथ, ऐसा नहीं है - यहां तक ​​कि अलग-अलग dtypes को बनाए रखा जाना चाहिए जैसे ...

यहाँ पर मैंने py3 में मिश्रित int / str पर argsort उड़ाने का तरीका दिया है: https://github.com/pydata/pandas/pull/6222/files

वस्तु dtypes में तार से पहले ints आदेश
अनुक्रमणिका प्राप्त करने के लिए स्थानों को मैप करने के लिए हैशटेबल का उपयोग करें
यथोचित उपवास मुझे लगता है

पांडा हैशटेबल कार्यान्वयन का उपयोग करता है, लेकिन आसानी से मुझे लगता है कि सी-कोड के लिए अनुकूलित / अनुकूलित किया जा सकता है

कोई इस पर झूले लेना चाहता है? सुनिश्चित नहीं है कि रिकॉर्ड dtypes के बारे में क्या करना है।

इस पर कोई अपडेट? मुझे इस बग का सामना तब करना पड़ा जब पंडों पर डेटा-कॉलम के डीकाइप "ऑब्जेक्ट" और अनुपलब्ध मान के साथ scikit-learn's LabelEncoder का उपयोग करने का प्रयास किया गया

यह वास्तव में पुराना है। क्या यह अभी भी प्रासंगिक है?

डेबियन में कम से कम 1.15.4 के साथ ऐसा प्रतीत होता है:

$> python3 --version
Python 3.6.5

$> PYTHONPATH=.. python3 -c 'import numpy as np; print(np.__version__); print(repr(repr(np.unique(np.array([1,2,None, "str"])))))'                                                                                   
1.15.4
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib/python3/dist-packages/numpy/lib/arraysetops.py", line 233, in unique
    ret = _unique1d(ar, return_index, return_inverse, return_counts)
  File "/usr/lib/python3/dist-packages/numpy/lib/arraysetops.py", line 281, in _unique1d
    ar.sort()
TypeError: '<' not supported between instances of 'NoneType' and 'int'

निश्चित रूप से अभी भी प्रासंगिक है। बस इस पार आया, एक वस्तु सरणी पर np.unique(x, return_inverse=True) कॉल करने की कोशिश कर रहा है।

इस काम को करने के लिए _how_ के सवाल के बारे में, जब छंटाई अपरिभाषित होती है: मैं एक त्रुटि को बढ़ाने की यथास्थिति पर एक धीमी एल्गोरिदम को पसंद करूंगा। (मेरे अनुभव में, अक्सर, यदि आपको प्रदर्शन करने वाले एल्गोरिदम की आवश्यकता होती है, तो आपको शुरू करने के लिए ऑब्जेक्ट सरणी का उपयोग नहीं करना चाहिए।)

मुझे लगता है कि यह एक सुविधा अनुरोध है, बग नहीं। डॉक्स स्पष्ट रूप से बताता है:

किसी सरणी के _sorted_ अद्वितीय तत्व लौटाता है।

[1, None] जैसे किसी सरणी के मामले के लिए, अजगर 3 में ऐसा कोई सॉर्ट किया गया सरणी मौजूद नहीं है क्योंकि छंटाई अब अच्छी तरह से परिभाषित नहीं है।

अच्छा होगा कि _not_ एक सॉर्ट किए गए सरणी को वापस करने का विकल्प हो, यह कुछ अनुकूलन की अनुमति देगा।

क्या यह पृष्ठ उपयोगी था?
0 / 5 - 0 रेटिंग्स