2017-11-10 10 views
1

この質問はthis oneと似ていますが、私のケースではそれを適用する方法が見つかりませんでした。値のリストと一致する行を見つける効率的な方法

私はかなり大きなNx3の整数の行列を持っています。私は、整数のリストに一致する行のリストを見つける必要があります。最終的な目標は、行列をフィルタリングして、これらの値の1つを含む行を削除することです。

現在、私が出すことができる最高のものは、整数のリストにforループがあり、行を見つけるのにnumpy.logical_and.reduceです。私はより低レベルの言語に行かなくても、より効率的な方法がなければならないと信じています。

import numpy as np 
matrix = np.random.randint(0,100000,(50000, 3)) 
values_to_find = np.random.randint(0,100000,10000) 
matches = np.ones(len(matrix), bool) 
for value in values_to_find: 
    matches = matches & np.logical_and.reduce(matrix != value, axis=1) 
new_matrix = matrix[matches] 

効率的でエレガントな方法は何ですか?

+0

したがって、value_to_findの値のいずれかを保持する行が必要ですか? – Dark

答えて

2

別のアプローチをnp.isinすなわちで

matrix[~np.isin(matrix, values_to_find).any(1)] 
+1

喜んでください!私はあなたの解決策を受け入れました。なぜなら、 'timeit'は答えを区別するようには見えず、あなたのものは読みやすくなっているからです。ありがとう、 'np.isin'または' any'の軸を指定できるという事実については知らなかった。 – nicoco

2

一つのアプローチは、np.in1dですべての行全体にマッチのマスクを取得し、いずれかの試合で行を探し、その後、残りの行を取得するだろう -

matrix[~np.in1d(matrix, values_to_find).reshape(matrix.shape).any(1)] 
+2

あなたはとても速いです。あなたが投稿した解決策を私はここに来た。 – Dark

関連する問題