2013-04-11 24 views
18

この問題は簡単なようですが、私はきれいな解決策を得ることができません。私は2つのnumpy配列(AとB)を持っています。そして、Aの要素がBにあり、Aの要素がBにないインデックスを取得したいと思います。numpy配列の各要素が別の配列にあるかどうかを確認してください

現在、私はAが順序である、と私に[1, 3, 5]Aにある要素のインデックスを与えるという事実を利用して

C = np.searchsorted(A,B) 

を使用しています

A = np.array([1,2,3,4,5,6,7]) 
B = np.array([2,4,6]) 

。これは素晴らしいですが、D = [0,2,4,6]Aの要素のインデックスはBにありません。

答えて

6
import numpy as np 

A = np.array([1,2,3,4,5,6,7]) 
B = np.array([2,4,6]) 
C = np.searchsorted(A, B) 

D = np.delete(np.arange(np.alen(A)), C) 

D 
#array([0, 2, 4, 6]) 
+0

ありがとう!私はまた、np.setdiff1dを使用してalexhbによって提供される答えが好きです。私は指数を直接与える機能があることを期待していましたが、これはうまくいきます。 – DanHickstein

+0

@ダンかもしれないが、私はそれを考えることができない。 'C'を必要としない場合は、彼の解決方法を使用しますが、' C'をすでに持っていれば私の倍速は2倍になります。 – askewchan

3
import numpy as np 

a = np.array([1, 2, 3, 4, 5, 6, 7]) 
b = np.array([2, 4, 6]) 
c = np.searchsorted(a, b) 
d = np.searchsorted(a, np.setdiff1d(a, b)) 

d 
#array([0, 2, 4, 6]) 
+0

2度検索すると、これが少し遅くなります。既に知られている 'C'を使用して' D'を取得する方が良いでしょう。しかし、もちろんこれは 'C 'が必要ない場合には良い解決策です。 ([SO]へようこそ!) – askewchan

30

searchsorted Bのすべての要素がAにありません場合は、numpy.in1dを使用することができますあなたの間違った答えを与えることがあります。

A = np.array([1,2,3,4,5,6,7]) 
B = np.array([2,4,6,8]) 
mask = np.in1d(A, B) 
print np.where(mask)[0] 
print np.where(~mask)[0] 

出力は次のようになります。しかし

[1 3 5] 
[0 2 4 6] 

in1d()大規模なデータセットでは遅いソートを使用します。データセットが大きい場合は、パンダを使用することができます。

A = np.random.randint(0, 1000, 10000) 
B = np.random.randint(0, 1000, 10000) 

%timeit np.where(np.in1d(A, B))[0] 
%timeit np.where(pd.Index(pd.unique(B)).get_indexer(A) >= 0)[0] 

出力:

100 loops, best of 3: 2.09 ms per loop 
1000 loops, best of 3: 594 µs per loop 
+2

私のデータセットが非常に大きいので、この効率的な方法について知っておきましょう。このソリューションにはありがとうございます! – DanHickstein

2

BにもあるAの要素:

ここ

import pandas as pd 
np.where(pd.Index(pd.unique(B)).get_indexer(A) >= 0)[0] 

は時間の比較であります

セット(A)&セット(B)

Bに含まれていないことのの

要素:

セット(A) - セット(B)

関連する問題