_ 2012年7月23日のhttp://projects.scipy.org/numpy/ticket/2188 、不明に割り当てられています。_
現在のマスターに対してテスト済み(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)'
注意:まだ提出されていない場合は、 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
を実装するための唯一のオプションは次のとおりです。
==
比較を行うソートとハッシュの戦略だけが妥当な速度を持ち、ソートとすべてに対してすべての戦略だけが大きな配列に対して妥当なメモリオーバーヘッドを持っています。 だから私たちは、ソートが機能しない場合、他の戦略の1つを試すユニークなものにフォールバックオプションを追加できると思いますか? しかし、OTOHは、入力内容によっては、突然CPUやメモリを大量に消費する機能があるのは良くありません。
np.uniqueにstrategy = {"sort"、 "hash"、 "bruteforce"}オプションを追加するパッチでは、+ 1になると思います。これにより、奇妙なデータを持つユーザーは、自分の状況に適したものを決定できます。 あなたがそのようなことを書きたいなら:-)
最初は、ソートできないアイテムのソート+ハッシュテーブル(dtypeオブジェクト配列の要素をソートするときに要素のcmpが使用されているかどうかを確認しなかった)である可能性があるので、 __cmp__
ソートするとそれらを '先着順で配置できるかどうか疑問に思いました-ファーストインラインの注文?
しかし、その後、たとえばintとstrが混在している場合など、比較できない型に対しては一般に救済が提供されないことに気付きました...したがって、dtype = objectの場合、最初に参加するdtypeと 'uniqueを推測することが可能かどうか疑問に思いました。 '(おそらくソートを介して)各dtype内で、 __cmp__
ない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)を実行して一意のものを取得できます
要素ですが、一般的にハッシュ可能であるという保証はありません。 (しかし、少なくとも
ハッシュ可能なオブジェクトの場合、これは_動作_する必要がありますが、これは正しくありません。
ソート用。)多分これはのより良いデフォルトの実装でしょう
オブジェクト配列のnp.unique。
2013年9月17日火曜日午後5時40分、Yaroslav Halchenko <
[email protected]>書き込み:
最初は、ソート+ハッシュテーブルでソートできないのではないかと思いました
アイテム(の要素を並べ替えるときに要素の_cmp_が使用されているかどうかを確認しませんでした
dtypeオブジェクト配列) cmpを並べ替えると、それらを配置できます
「先着順」の注文?
しかし、それは一般的に救済を提供しないことに気づきました
比類のないタイプ、例えばそれがintとstrの混合であるとき...だから私は疑問に思いました
dtype = objectの場合、最初の参加を推測することが可能である可能性があります
おそらく依存している各dtype内のdtypesと 'unique'(おそらくsortを介して)
cmpのないdtypeのハッシュテーブルで?—
このメールに直接返信するか、Gi tHubhttps://github.com/numpy/numpy/issues/641#issuecomment-24603047で表示してください
。
gy ... ok-Pythonでの残酷な説明:
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)。 その定義はしません
標準のPythonの概念に対応します。
2013年9月17日18:01、「YaroslavHalchenko」 [email protected]は次のように書いています。
確かなこと-非オブジェクトのndarrayに対して「バケット化」を行うべきではありません
—
このメールに直接返信するか、Gi tHubhttps://github.com/numpy/numpy/issues/641#issuecomment-24604740で表示してください
。
確かに! 確かではありませんが、バケット全体の事後分析は理にかなっているかもしれません...ところで、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は、使用可能なすべての選択肢(int / float / complex)の中で何にすべきでしょうか? 非オブジェクト配列の場合は明らかです...異種オブジェクト配列の場合はそうではありません-異なるdtypeをそのように維持する必要があるかもしれません...
py3の混合int / strで爆発するargsort
を解決する方法は次のとおりです: https :
オブジェクトdtypesの文字列の前にintを並べ替えます
ハッシュテーブルを使用して場所をマッピングし、インデクサーを取得します
かなり速いと思います
パンダのハッシュテーブル実装を使用していますが、簡単に交換/ cコードに適合させることができると思います
誰もがこれでスイングしたいですか? レコードdtypeをどうするかわからない。
これに関する更新はありますか? dtypeが「object」で値が欠落しているパンダのDataFrame列でscikit-learnのLabelEncoderを使用しようとしたときに、このバグが発生しました。
これは本当に古いです。 それはまだ関連していますか?
少なくともdebianの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]
のような配列の場合、並べ替えが明確に定義されていないため、Python3にはそのような並べ替えられた配列は存在しません。
ソートされた配列を返さないオプションがあると便利です。これにより、いくつかの最適化が可能になります。
最も参考になるコメント
これに関する更新はありますか? dtypeが「object」で値が欠落しているパンダのDataFrame列でscikit-learnのLabelEncoderを使用しようとしたときに、このバグが発生しました。