配列内の重複する値の判定
質問
例えば、以下のような配列があるとします。
a = np.array([1, 2, 1, 3, 3, 3, 0])
の要素を見つけるにはどうしたらよいでしょうか?
a
のどの要素が重複しているか(すなわち、一意でない値)を見つけることができますか? この場合、結果は次のようになります。
array([1, 3, 3])
または、おそらく
array([1, 3])
とすることもできます。
うまくいきそうな方法をいくつか思いつきました。
マスキング
m = np.zeros_like(a, dtype=bool)
m[np.unique(a, return_index=True)[1]] = True
a[~m]
セット操作
a[~np.in1d(np.arange(len(a)), np.unique(a, return_index=True)[1], assume_unique=True)]
これはかわいいですが、おそらく違法です (
a
は実際にはユニークではないので)。
np.setxor1d(a, np.unique(a), assume_unique=True)
ヒストグラム
u, i = np.unique(a, return_inverse=True)
u[np.bincount(i) > 1]
並べ替え
s = np.sort(a, axis=None)
s[:-1][s[1:] == s[:-1]]
パンダ
s = pd.Series(a)
s[s.duplicated()]
私が見逃しているものはありますか? 私は必ずしもnumpyのみのソリューションを探しているわけではありませんが、numpyのデータ型を使用して動作し、中規模のデータセット(最大1000万サイズ)で効率的である必要があります。
結論
1,000 万サイズのデータセットでテスト (2.8GHz Xeon 上)。
a = np.random.randint(10**7, size=10**7)
一番速いのはソートで、1.1秒です。 怪しげな
xor1d
が2.6秒で2位、次いでマスキングとPandasの
Series.duplicated
が3.1sで続いています。
bincount
が5.6秒、そして
in1d
とセンダルの
setdiff1d
はともに7.3秒。 スティーブンの
Counter
は10.5秒と少し遅く、その後ろにいるのはBurhanの
Counter.most_common
が110秒台、DSMの
Counter
を360sで引き算します。
パフォーマンスのためにソートを使うつもりですが、スティーブンの答えを受け入れるのは、パフォーマンスが許容範囲内であることと が感じられます。 より明確で、よりPythonicに感じられるからです。
編集:Pandasの解決策を発見しました。 Pandasが使えるならクリアで性能も良い。
どのように解決するのですか?
の外側で行うのが一番わかりやすいと思います。
numpy
. に対してタイミングを合わせる必要があります。
numpy
ソリューションと比較する必要があります。
>>> import numpy as np
>>> from collections import Counter
>>> a = np.array([1, 2, 1, 3, 3, 3, 0])
>>> [item for item, count in Counter(a).items() if count > 1]
[1, 3]
をメモしてください。
これはBurhan Khalidの答えと似ていますが、使用されているのは
items
を使用した方が速いでしょう。
関連
-
[解決済み] 列の値に基づいてDataFrameから行を選択するにはどうすればよいですか?
-
[解決済み] 環境変数の値にアクセスする方法
-
[解決済み] JavaScriptの配列で一意な値をすべて取得する(重複を排除する)。
-
[解決済み] SQLテーブルで重複する値を検索する
-
[解決済み] NaN値をチェックするにはどうすればよいですか?
-
[解決済み] 重複した行を削除するにはどうすればよいですか?
-
[解決済み] JavaScriptで配列を複製する最速の方法 - スライス vs. 'for'ループ
-
[解決済み] MySQLの重複レコードを検索する
-
[解決済み] Notepad++で重複した行を削除する
-
[解決済み] virtualenv の `--no-site-packages` オプションを元に戻す。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Spyderを仮想環境で動作させるには?
-
[解決済み] SQLAlchemy: 日付フィールドをフィルタリングする方法は?
-
[解決済み] Pythonのargparseを使った隠し引数の作成
-
[解決済み] DataFrameに日付間の日数カラムを追加する pandas
-
[解決済み] SQLAlchemy - テーブルのリストを取得する
-
[解決済み] サブフォルダからのインポートモジュール
-
[解決済み] Django で全てのリクエストヘッダを取得するにはどうすれば良いですか?
-
[解決済み] Pandasのデータフレーム内の文字列を'date'データ型に変換するにはどうしたらいいですか?
-
[解決済み] Python Empty Generator 関数
-
[解決済み] Pythonの文字列の前にあるbという接頭辞は何を意味するのですか?