2012-01-08 16 views
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]) 

我知道這可能是可以實現的使用set操作,但我不知道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

爲什麼使用'set'類似的東西?你沒有使用任何設置操作... – joaquin 2012-01-08 13:13:35

+1

我正在使用「in」來檢查一個元素是否在集合中,哪個集合最好是 - 它的O(1)操作。如果dataINeed的大小總是很小(比如5),那麼dataINeed中的x就足夠了。 – 2012-01-08 13:33:17

2

Roman Susi's solution非常快(與我想出的想法相比)。

下面是對那些其他方法的幾個基準:

在此設置:

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((dataINeedset中的x用於數據中的x),bool,count = -1)來改進,但其主要關於內存,而不是速度。提示在這裏找到:http://stackoverflow.com/questions/367565/how-do-i-build-a-numpy-array-from-a-generator – 2012-01-08 13:50:58

+0

是的。已更新爲使用'np.iter'。 – unutbu 2012-01-08 14:08:05