この質問は関連しています (ただし、同じではありません) 「numpy.unique は、どの点で一意のリストを生成しますか?」
セットアップ:
import numpy as np
from functools import total_ordering
@total_ordering
class UniqueObject(object):
def __init__(self, a):
self.a = a
def __eq__(self, other):
return self.a == other.a
def __lt__(self, other):
return self.a < other.a
def __hash__(self):
return hash(self.a)
def __str__(self):
return "UniqueObject({})".format(self.a)
def __repr__(self):
return self.__str__()
の予期される動作np.unique
:
>>> np.unique([1, 1, 2, 2])
array([1, 2])
>>> np.unique(np.array([1, 1, 2, 2]))
array([1, 2])
>>> np.unique(map(UniqueObject, [1, 1, 2, 2]))
array([UniqueObject(1), UniqueObject(2)], dtype=object)
これは問題ありません。動作します。しかし、これは期待どおりに機能しません:
>>> np.unique(np.array(map(UniqueObject, [1, 1, 2, 2])))
array([UniqueObject(1), UniqueObject(1), UniqueObject(2), UniqueObject(2)], dtype=object)
dtype=object を指定した np.array は、オブジェクトを含む Python リストとは異なる方法で処理されるのはなぜですか?
あれは:
objs = map(UniqueObject, [1, 1, 2, 2])
np.unique(objs) != np.unique(np.array(objs)) #?
私は走っていてnumpy 1.8.0.dev-74b08b3
、Python 2.7.3