Numpy: python3 : ν•­λͺ© μœ ν˜•μ΄ λ‹€μ–‘ν•œ dtype = object λ°°μ—΄μ—μ„œ 고유 ν•œ νšŒκ·€ 뢄석 (Trac # 2188)

에 λ§Œλ“  2012λ…„ 10μ›” 19일  Β·  18μ½”λ©˜νŠΈ  Β·  좜처: numpy/numpy

_2012-07-23 @yarikoptic의 원본 ν‹°μΌ“ http://projects.scipy.org/numpy/ticket/2188 , unknown에 ν• λ‹Ή 됨 _

ν˜„μž¬ λ§ˆμŠ€ν„°μ— λŒ€ν•΄ ν…ŒμŠ€νŠΈ 됨 (1.6.2에도 있음) :

python2.x μ‹œλ¦¬μ¦ˆλ₯Ό μ‚¬μš©ν•˜λ©΄ puking없이 μ •μƒμ μœΌλ‘œ μž‘λ™ν•©λ‹ˆλ‹€.

$> 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)'

NB 아직 μ œμΆœν•˜μ§€ μ•Šμ€ 경우 μ—¬κΈ°μ—μ„œ repr에 λŒ€ν•œ 버그λ₯Ό λ³„λ„λ‘œλ³΄κ³ ν•˜κ² μŠ΅λ‹ˆλ‹€.

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κ°€ μ˜¬λ°”λ₯΄κ²Œ μž‘λ™ν•΄μ•Ό ν•  λ•Œλ§ˆλ‹€-unique () λ™μž‘μ˜ μ˜λ―ΈλŠ” μš”μ†Œλ₯Ό μ •λ ¬ν•˜λŠ” λŠ₯λ ₯을 μ˜λ―Έν•΄μ„œλŠ” μ•ˆλ©λ‹ˆλ‹€.

00 - Bug numpy.core

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

이것에 λŒ€ν•œ μ—…λ°μ΄νŠΈκ°€ μžˆμŠ΅λ‹ˆκΉŒ? dtype "object"및 λˆ„λ½ 된 κ°’μ΄μžˆλŠ” pandas DataFrame μ—΄μ—μ„œ scikit-learn의 LabelEncoder λ₯Ό μ‚¬μš©ν•˜λ €κ³  ν•  λ•Œμ΄ 버그가 λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

λͺ¨λ“  18 λŒ“κΈ€

이 λ¬Έμ œμ— λŒ€ν•œ μƒˆλ‘œμš΄ 아이디어가 μžˆμŠ΅λ‹ˆκΉŒ?

unique κ΅¬ν˜„μ„μœ„ν•œ μœ μΌν•œ μ˜΅μ…˜μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • λ°°μ—΄ μ •λ ¬
  • λͺ¨λ“  것을 ν•΄μ‹œ ν…Œμ΄λΈ”μ— λ„£κΈ°
  • λͺ¨λ“  κ°œμ²΄μ— λŒ€ν•΄ λͺ¨λ“  κ°œμ²΄μ— λŒ€ν•΄ 무차별 λŒ€μž… == 비ꡐ μˆ˜ν–‰

μ •λ ¬ 및 ν•΄μ‹± μ „λž΅ 만이 합리적인 속도λ₯Ό 가지며, μ •λ ¬ 및 λͺ¨λ“  μ „λž΅ 만이 λŒ€κ·œλͺ¨ 배열에 λŒ€ν•΄ 합리적인 λ©”λͺ¨λ¦¬ μ˜€λ²„ ν—€λ“œλ₯Ό κ°–μŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ 정렬이 μž‘λ™ν•˜μ§€ μ•ŠμœΌλ©΄ λ‹€λ₯Έ μ „λž΅ 쀑 ν•˜λ‚˜λ₯Ό μ‹œλ„ν•˜λŠ” 고유 ν•œ μœ„μΉ˜μ— 폴백 μ˜΅μ…˜μ„ μΆ”κ°€ ν•  수 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ OTOHλŠ” μ–΄λ–€ μž…λ ₯을 μ œκ³΅ν•˜λŠ”μ§€μ— 따라 κ°‘μžκΈ° 더 λ§Žμ€ CPU λ˜λŠ” λ©”λͺ¨λ¦¬λ₯Ό κ°‘μžκΈ° μ°¨μ§€ν•˜λŠ” κΈ°λŠ₯을 κ°–λŠ” 것은 쒋지 μ•ŠμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” np.unique에 μ „λž΅ = { "sort", "hash", "bruteforce"} μ˜΅μ…˜μ„ μΆ”κ°€ν•˜λŠ” νŒ¨μΉ˜μ— +1이 될 것 κ°™μ•„μ„œ μ΄μƒν•œ 데이터λ₯Ό 가진 μ‚¬μš©μžκ°€ μžμ‹ μ˜ 상황에 λ§žλŠ” 것을 κ²°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 그런 것을 μ“°κ³  μ‹Άλ‹€λ©΄ :-)

μ²˜μŒμ—λŠ” μ •λ ¬ ν•  μˆ˜μ—†λŠ” ν•­λͺ©μ— λŒ€ν•΄ + ν•΄μ‹œ ν…Œμ΄λΈ”μ„ μ •λ ¬ ν•  수 μžˆλŠ”μ§€ κΆκΈˆν–ˆμŠ΅λ‹ˆλ‹€ (dtype 개체 λ°°μ—΄μ˜ μš”μ†Œλ₯Ό μ •λ ¬ ν•  λ•Œ μš”μ†Œμ˜ cmp κ°€ μ‚¬μš©λ˜λŠ”μ§€ ν™•μΈν•˜μ§€ μ•ŠμŒ) κ·Έλž˜μ„œ __cmp__ μ •λ ¬ν•˜λ©΄ 'μ„ μ°©μˆœ -첫 번째 μ£Όλ¬Έ?
κ·ΈλŸ¬λ‚˜ int와 str의 ν˜Όν•©κ³Ό 같이 비ꡐ할 μˆ˜μ—†λŠ” μœ ν˜•μ— λŒ€ν•΄μ„œλŠ” 일반적으둜 μ™„ν™”λ₯Ό μ œκ³΅ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것을 κΉ¨λ‹¬μ•˜μŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ dtype = object에 λŒ€ν•΄ 처음 μ°Έμ—¬ν•˜λŠ” dtypeκ³Ό 'unique'λ₯Ό μΆ”λ‘ ν•˜λŠ” 것이 κ°€λŠ₯ν•  수 μžˆλŠ”μ§€ κΆκΈˆν–ˆμŠ΅λ‹ˆλ‹€. '(μ•„λ§ˆλ„ 정렬을 톡해) __cmp__ 없이 dtype에 λŒ€ν•œ ν•΄μ‹œ ν…Œμ΄λΈ”μ— μ˜μ‘΄ν•˜λŠ” 각 dtype λ‚΄μ—μ„œ?

ν•΄κ²° 방법이 ν•„μš”ν•œ μ‚¬λžŒλ“€μ„ μœ„ν•΄ λ‹€μŒμ€ λ‚΄ κ²½μš°μ— λ‚΄μž₯ 된 μ„ΈνŠΈλ₯Ό 톡해 'ν•΄μ‹±'을 톡해 μˆ˜ν–‰ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

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

방금 λ§ν•œ λ‚΄μš©μ΄ ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. :-)

κ·ΈλŸ¬λ‚˜ 더 μƒκ°ν•˜λ©΄ 정렬은 μ‹€μ œλ‘œ dtype = object에 λŒ€ν•΄ μ‹ λ’°ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
μ–΄μ¨Œλ“ . μ•„λ§ˆλ„ eq λ₯Ό μž¬μ •μ˜ν•˜λŠ” μˆ˜μ‹­ 개의 클래슀λ₯Ό μž‘μ„±ν–ˆμ§€λ§Œ
κΈ°λ³Έ ltλ₯Ό μœ μ§€ν•©λ‹ˆλ‹€. 즉, μ •λ ¬ 기반 고유의
쑰용히 μ˜€λ‹΅μ„ λŒλ €μ€λ‹ˆλ‹€. 이것은 λ‚΄κ°€ μƒκ°ν•˜κΈ°μ— 맀우 λΆˆμΎŒν•œ λ²„κ·Έμž…λ‹ˆλ‹€.

객체가 ν•΄μ‹œ κ°€λŠ₯ν•˜λ©΄ set (arr)을 μˆ˜ν–‰ν•˜μ—¬ 고유 ν•œ
μš”μ†Œμ΄μ§€λ§Œ 일반적으둜 ν•΄μ‹œ κ°€λŠ₯ν•˜λ‹€λŠ” 보μž₯은 μ—†μŠ΅λ‹ˆλ‹€. (ν•˜μ§€λ§Œ 적어도
ν•΄μ‹œ κ°€λŠ₯ν•œ 객체의 경우 이것이 사싀이 μ•„λ‹Œ _work_ν•΄μ•Όν•©λ‹ˆλ‹€.
정렬을 μœ„ν•΄.) μ•„λ§ˆλ„ 이것이 더 λ‚˜μ€ κΈ°λ³Έ κ΅¬ν˜„μ΄ 될 κ²ƒμž…λ‹ˆλ‹€.
객체 배열에 λŒ€ν•œ np.unique.

2013 λ…„ 9 μ›” 17 일 ν™”μš”μΌ μ˜€ν›„ 5:40, Yaroslav Halchenko <
[email protected]> μž‘μ„± :

μ²˜μŒμ—λŠ” μ •λ ¬ + ν•΄μ‹œ ν…Œμ΄λΈ”μ΄ μ •λ ¬λ˜μ§€ μ•Šμ•˜λŠ”μ§€ κΆκΈˆν–ˆμŠ΅λ‹ˆλ‹€.
ν•­λͺ© (μš”μ†Œλ₯Ό μ •λ ¬ ν•  λ•Œ _cmp_ μš”μ†Œκ°€ μ‚¬μš©λ˜λŠ”μ§€ ν™•μΈν•˜μ§€ μ•ŠμŒ)
dtype 객체 λ°°μ—΄) κ·Έλž˜μ„œ cmpλ₯Ό μ •λ ¬ν•˜λ©΄
'μ„ μ°©μˆœ'μ£Όλ¬Έ?
κ·ΈλŸ¬λ‚˜ 일반적으둜 μ•ˆλ„κ°μ„ μ œκ³΅ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것을 κΉ¨λ‹¬μ•˜μŠ΅λ‹ˆλ‹€.
비ꡐ할 μˆ˜μ—†λŠ” μœ ν˜•, 예λ₯Ό λ“€μ–΄ int와 str이 ν˜Όν•© 된 경우 ...
dtype = object의 경우 첫 번째 μ°Έμ—¬λ₯Ό μΆ”λ‘  ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
각 dtype λ‚΄μ—μ„œ dtypes 및 'unique'(μ•„λ§ˆλ„ 정렬을 톡해)
cmpκ°€ μ—†λŠ” dtypes에 λŒ€ν•œ ν•΄μ‹œ ν…Œμ΄λΈ”μ—μ„œ?

β€”
이 이메일에 직접 λ‹΅μž₯ν•˜κ±°λ‚˜ Gi tHubμ—μ„œ 확인 ν•˜μ„Έμš”.
.

gy ... ok-파이썬의 μž”μΈν•œ μ„€λͺ… :

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]

ν™•μ‹€ν•œ 것-λΉ„ 객체 ndarray에 λŒ€ν•΄ '버킷 νŒ…'을 μˆ˜ν–‰ν•΄μ„œλŠ” μ•ˆλ©λ‹ˆλ‹€.

κ·Έ μ•Œκ³ λ¦¬μ¦˜μ€ κ³ μœ μ„±μ˜ μ •μ˜λ‘œ ==λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λŒ€μƒ
λ‹€λ₯Έ μœ ν˜•μ€ == 일 수 μžˆμŠ΅λ‹ˆλ‹€. (μ‰¬μš΄ 예 : 1, 1.0). κ·Έ μ •μ˜λŠ”
ν‘œμ€€ 파이썬 κ°œλ…μ— ν•΄λ‹Ήν•©λ‹ˆλ‹€.
2013 λ…„ 9 μ›” 17 일 18:01에 "Yaroslav Halchenko" [email protected]이 μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€.

ν™•μ‹€ν•œ 것-λΉ„ 객체 ndarray에 λŒ€ν•΄ '버킷 νŒ…'을 μˆ˜ν–‰ν•΄μ„œλŠ” μ•ˆλ©λ‹ˆλ‹€.

β€”
이 이메일에 직접 νšŒμ‹ ν•˜κ±°λ‚˜ Gi tHubμ—μ„œ ν™•μΈν•˜μ‹­μ‹œμ˜€.
.

κ³Όμ—°! ν™•μ‹€ν•˜μ§€λŠ” μ•Šμ§€λ§Œ 버킷에 λŒ€ν•œ 사후 뢄석이 μ˜λ―Έκ°€μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€ ... 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]

두 번째 μƒκ°μ—μ„œ- '고유 ν•œ'κ°’ dtype은 μ‚¬μš© κ°€λŠ₯ν•œ λͺ¨λ“  선택 (int / float / complex) 쀑 λ¬΄μ—‡μ΄μ–΄μ•Όν•©λ‹ˆκΉŒ? λΉ„ 객체 배열을 μ‚¬μš©ν•˜λ©΄ λͺ…ν™•ν•©λ‹ˆλ‹€ ... 이기쒅 객체 배열을 μ‚¬μš©ν•˜λ©΄ 그렇지 μ•ŠμŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ dtype도 μœ μ§€ν•΄μ•Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€ ...

py3μ—μ„œ ν˜Όν•© 된 int / strμ—μ„œ ν­λ°œν•˜λŠ” argsort ν•΄κ²° ν•œ 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. https://github.com/pydata/pandas/pull/6222/files

개체 dtypes의 λ¬Έμžμ—΄ μ•žμ— int μˆœμ„œ
ν•΄μ‹œ ν…Œμ΄λΈ”μ„ μ‚¬μš©ν•˜μ—¬ μœ„μΉ˜λ₯Ό λ§€ν•‘ν•˜μ—¬ μΈλ±μ„œλ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€.
κ½€ λΉ λ₯΄λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€

pandas ν•΄μ‹œ ν…Œμ΄λΈ” κ΅¬ν˜„μ„ μ‚¬μš©ν•˜μ§€λ§Œ μ‰½κ²Œ ꡐ체 / C μ½”λ“œμ— 맞게 μ‘°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λˆ„κ΅¬λ“ μ§€ 이것에 μŠ€μœ™ν•˜κ³  μ‹Άμ–΄? λ ˆμ½”λ“œ dtype에 λŒ€ν•΄ 무엇을해야할지 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

이것에 λŒ€ν•œ μ—…λ°μ΄νŠΈκ°€ μžˆμŠ΅λ‹ˆκΉŒ? dtype "object"및 λˆ„λ½ 된 κ°’μ΄μžˆλŠ” pandas DataFrame μ—΄μ—μ„œ scikit-learn의 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] 와 같은 λ°°μ—΄μ˜ 경우 정렬이 더 이상 잘 μ •μ˜λ˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ Python 3μ—λŠ” μ΄λŸ¬ν•œ μ •λ ¬ 된 배열이 μ—†μŠ΅λ‹ˆλ‹€.

μ •λ ¬ 된 배열을 λ°˜ν™˜ν•˜μ§€ _not_ν•˜λŠ” μ˜΅μ…˜μ΄ 있으면 쒋을 κ²ƒμž…λ‹ˆλ‹€. 일뢀 μ΅œμ ν™”λ₯Ό ν—ˆμš©ν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰