2012-01-08 15 views
1

配列索引付けに使用するマスクを作成するためのきれいな表現を探しています。ベクトルが2つあり、1つは興味のあるデータを表し、もう1つはデータ自体を含んでいます。私は次のようにこの作業を取得しようとしました:配列索引付けの場合

dataINeed = np.arange(3) 

-array([0,1,2]) 

data = random.randint(10,size = (10)) 

-array([5,7,9,1,5,3,7,1,2,0]) 

mask = data in dataINeed 

- array([False,False,False,True,False,False,False,True,True,True]) 

私は、これは達成可能集合演算を使用している場合がありますが、私はそのような結果を出すためにreciepeを見つけ出すことができませんでした知っています。これに関する助言?

答えて

3

このようなものはいいですか?

>>> import numpy as np 
>>> dataINeed = np.arange(3) 
>>> dataINeed 
array([0, 1, 2]) 
>>> data = np.array([5,7,9,1,5,3,7,1,2,0]) 
>>> dataINeedset = set(dataINeed) 
>>> np.array([x in dataINeedset for x in data]) 
array([False, False, False, True, False, False, False, True, True, True], dtype=bool) 
+0

:この設定で

:ここ

は、これらの他の方法に対していくつかのベンチマークですか?設定された操作を使用していません... – joaquin

+1

"in"を使用して、要素がセットに含まれているかどうかを確認しています。そのセットは、そのO(1)操作で最適です。 dataINeedのサイズが常に小さい場合(例えば、5未満)、dataINeedのxで十分です。 –

2

Roman Susi's solution(私が思い付いたアイデアと比較して)非常に高速です。そのような何かのための `set`を使用するのはなぜ

import numpy as np 

N = 10000 
m = 3000 
dataINeed = np.arange(m) 
data = np.random.randint(N,size = (N)) 

In [76]: %timeit dataINeedset = set(dataINeed); np.fromiter((x in dataINeedset for x in data),dtype = bool, count = -1) 
100 loops, best of 3: 4.46 ms per loop 

In [61]: %timeit ~np.prod(np.subtract.outer(data,dataINeed).astype('bool'),axis=-1,dtype='bool') 
1 loops, best of 3: 335 ms per loop (Roman's solution is 75x faster than mine!) 

In [54]: %timeit np.logical_or.reduce([(data == x) for x in dataINeed]) 
1 loops, best of 3: 1.72 s per loop (Roman's solution is 386x faster) 
+0

ありがとうございます。私は、numpy.fromiter(data in xのdataineedsetのx、bool、count = -1)を使ってalittleビットを改善することができると思います。ヒント:http://stackoverflow.com/questions/367565/how-do-i-build-a-numpy-array-from-a-generator –

+0

はい。 'np.iter'を使うように更新されました。 – unutbu

関連する問題