_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 () λμμ μλ―Έλ μμλ₯Ό μ λ ¬νλ λ₯λ ₯μ μλ―Έν΄μλ μλ©λλ€.
μ΄ λ¬Έμ μ λν μλ‘μ΄ μμ΄λμ΄κ° μμ΅λκΉ?
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_νλ μ΅μ μ΄ μμΌλ©΄ μ’μ κ²μ λλ€. μΌλΆ μ΅μ νλ₯Ό νμ©ν©λλ€.
κ°μ₯ μ μ©ν λκΈ
μ΄κ²μ λν μ λ°μ΄νΈκ° μμ΅λκΉ? dtype "object"λ° λλ½ λ κ°μ΄μλ pandas DataFrame μ΄μμ scikit-learnμ LabelEncoder λ₯Ό μ¬μ©νλ €κ³ ν λμ΄ λ²κ·Έκ° λ°μνμ΅λλ€.