Numpy: python3: انحدار فريد في نوع dtype = مصفوفات كائن بأنواع عناصر مختلفة (Trac # 2188)

تم إنشاؤها على ١٩ أكتوبر ٢٠١٢  ·  18تعليقات  ·  مصدر: numpy/numpy

_التذكرة الأصلية http://projects.scipy.org/numpy/ticket/2188 بتاريخ 2012-07-23 بواسطة yarikoptic ، مخصصة لـ unknown._

تم اختباره مقابل المعلم الحالي (موجود في 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

التعليق الأكثر فائدة

أي تحديثات على هذا؟ لقد واجهت هذا الخطأ عند محاولة استخدام LabelEncoder الخاص بـ scikit- Learn على أعمدة Pandas DataFrame مع نوع dtype "كائن" وقيم مفقودة

ال 18 كومينتر

أي أفكار جديدة حول هذه المسألة؟

الخيارات الوحيدة لتنفيذ unique هي:

  • فرز المصفوفة
  • وضع كل شيء في جدول التجزئة
  • قم بمقارنة == بالقوة الغاشمة على كل الكائنات مقابل كل الكائنات

تتميز استراتيجيات الفرز والتجزئة فقط بالسرعة المعقولة ، وفقط استراتيجيات الفرز والتجزئة لها سعة ذاكرة معقولة للمصفوفات الكبيرة. لذلك أعتقد أنه يمكننا إضافة خيارات احتياطية إلى فريدة حيث إذا لم ينجح الفرز ، فإنه يجرب إحدى الاستراتيجيات الأخرى؟ لكن OTOH ليس من الجيد أن يكون لديك وظيفة تستهلك فجأة في بعض الأحيان بشكل كبير وحدة المعالجة المركزية أو الذاكرة اعتمادًا على المدخلات التي تقدمها لها.

أعتقد أنني سأقوم بإجراء +1 على رقعة تضيف إستراتيجية = {"sort"، "hash"، "bruteforce"} الخيار إلى np.unique ، بحيث يمكن للمستخدمين الذين لديهم بيانات غريبة أن يقرروا ما هو منطقي لموقفهم. إذا كنت تريد كتابة مثل هذا الشيء :-)

في البداية تساءلت عما إذا كان يمكن أن يكون ترتيبًا + جدول تجزئة للعناصر غير القابلة للترتيب (لم تتحقق مما إذا تم استخدام cmp من العناصر عند فرز عناصر مصفوفة كائن dtype) لذا فإن الفرز __cmp__ يمكن أن يضعها على "من يأتي أولاً" -الأول في الخط؟
ولكن بعد ذلك أدركت أنه لا يوفر الراحة بشكل عام للأنواع غير القابلة للمقارنة ، على سبيل المثال عندما يكون مزيجًا من int و str ... لذلك تساءلت عما إذا كان من الممكن استنتاج dtype = object لأول مرة و "فريد" '(ربما عن طريق الفرز) داخل كل نوع dtype ربما يعتمد على جداول التجزئة لأنواع dtypes بدون __cmp__ ؟

فقط لأولئك الذين قد يحتاجون إلى حل بديل ، إليك كيفية القيام بذلك من خلال "التجزئة" من خلال المجموعات المضمنة لحالتي:

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

لست متأكدًا مما قلته للتو :-)

ولكن على مزيد من التفكير ، فإن الفرز لا يمكن الاعتماد عليه حقًا بالنسبة لـ dtype = object
على أي حال. ربما كتبت عشرات الفئات التي تتجاوز مكافئ لكن
احتفظ بالقيمة الافتراضية
إعادة الإجابة الخاطئة بصمت. أعتقد أن هذا حشرة سيئة للغاية.

إذا كانت الكائنات قابلة للتجزئة ، فيمكنك فقط تعيين (arr) للحصول على العناصر الفريدة
العناصر ، ولكن لا يوجد ضمان بأنها قابلة للتجزئة بشكل عام. (ولكن على الأقل
يجب أن _عمل _ على كل شخص يتعامل مع الأشياء القابلة للتلف ، وهذا ليس صحيحًا
للفرز.) ربما يكون هذا تطبيقًا افتراضيًا أفضل لـ
np.unique لمصفوفات الكائنات.

يوم الثلاثاء 17 سبتمبر 2013 الساعة 5:40 مساءً ، ياروسلاف هالشينكو <
[email protected]> كتب:

في البداية تساءلت عما إذا كان من الممكن فرز + جدول التجزئة للفرز غير القابل للفرز
items (لم تتحقق مما إذا كان _cmp_ من العناصر يُستخدم عند فرز عناصر
dtype object array) بحيث يمكن لفرز cmp وضعها عليها
ترتيب "من يأتي أولاً في الخط"؟
ولكن بعد ذلك أدركت أنه لا يوفر الراحة بشكل عام
أنواع لا مثيل لها ، على سبيل المثال عندما تكون مزيجًا من int و str ... لذلك تساءلت
إذا كان dtype = object ، فمن الممكن استنتاج المشاركة الأولى
dtypes و "الفريد" (ربما عن طريق الفرز) داخل كل نوع dtype ربما يعتمد
على جداول التجزئة لـ dtypes بدون cmp ؟

-
قم بالرد على هذه الرسالة الإلكترونية مباشرة أو 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]

شيء مؤكد - لا يجب عمل "تجميع" لمصفوفات ndarra التي لا تحتوي على كائن

لا تستخدم هذه الخوارزمية == كتعريفها للتميز. كائنات
يمكن أن تكون الأنواع المختلفة ==. (مثال سهل: 1 ، 1.0). تعريفه لا
تتوافق مع أي مفهوم قياسي للبيثون.
في 17 سبتمبر 2013 18:01 ، كتب "Yaroslav Halchenko" [email protected] :

شيء مؤكد - لا يجب عمل "تجميع" لمصفوفات ndarra التي لا تحتوي على كائن

-
قم بالرد على هذه الرسالة الإلكترونية مباشرة أو tHubhttps: //github.com/numpy/numpy/issues/641#issuecomment -24604740
.

في الواقع! لست متأكدًا ولكن قد يكون التحليل اللاحق عبر المجموعات منطقيًا ... راجع أيضًا مشكلة أجهزة الصراف الآلي تكشف عن نفسها أيضًا للمقارنة مع الأرقام المركبة:

$> 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]

على الرغم من الفكرة الثانية - ما الذي يجب أن يكون نوع القيمة "الفريد" من بين جميع الخيارات المتاحة (int / float / complex)؟ مع مصفوفة غير كائن ، من الواضح ... مع مصفوفة كائنات غير متجانسة ، ليس كذلك - قد يكون هناك أنواع مختلفة يجب الحفاظ عليها على هذا النحو ...

هذه هي الطريقة التي حللت بها argsort تفجير مختلط int / str في py3: https://github.com/pydata/pandas/pull/6222/files

ترتيب ints قبل السلاسل في أنواع الكائن
استخدم علامة التجزئة لتعيين المواقع للحصول على المفهرس
سريع بشكل معقول على ما أعتقد

يستخدم تطبيق pandas hashtable ولكن يمكن بسهولة تبديله / تكييفه مع c-code على ما أعتقد

أي شخص يريد أن يتأرجح في هذا؟ لست متأكدًا مما يجب فعله حيال dtypes.

أي تحديثات على هذا؟ لقد واجهت هذا الخطأ عند محاولة استخدام LabelEncoder الخاص بـ scikit- Learn على أعمدة Pandas DataFrame مع نوع dtype "كائن" وقيم مفقودة

هذا حقا قديم هل ما زالت ذات صلة؟

يبدو أن هذا هو الحال على الأقل مع 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) على مصفوفة كائن.

فيما يتعلق بمسألة _كيف_ لإنجاح هذا العمل ، عندما يكون الفرز غير محدد: أنا أفضل الخوارزمية البطيئة على الوضع الراهن المتمثل في رفع الخطأ. (من واقع خبرتي ، في كثير من الأحيان ، إذا كنت بحاجة إلى خوارزميات فعالة ، فلا يجب أن تبدأ باستخدام مصفوفة كائنات.)

أعتقد أن هذا طلب ميزة ، وليس خطأ. تشير المستندات بوضوح إلى:

تُرجع عناصر المصفوفة الفريدة _sorted_.

في حالة مصفوفة مثل [1, None] ، لا توجد مثل هذه المصفوفة

سيكون من الجيد أن يكون لديك خيار _not_ إرجاع مصفوفة مرتبة ، فهذا سيسمح ببعض التحسينات.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات