2014-09-03 66 views
7

給定範圍,是否可以將索引數組轉換爲數組1和零? 即[2,3] - > [0,0,1,1,0],在5如何將索引數組轉換爲Numpy中的遮罩數組?

範圍我想自動化是這樣的:

>>> index_array = np.arange(200,300) 
array([200, 201, ... , 299]) 

>>> mask_array = ???   # some function of index_array and 500 
array([0, 0, 0, ..., 1, 1, 1, ... , 0, 0, 0]) 

>>> train(data[mask_array]) # trains with 200~299 
>>> predict(data[~mask_array]) # predicts with 0~199, 300~499 
+0

scipy有一個蒙面數組模塊。這與問題有關。 http://docs.scipy.org/doc/numpy/reference/maskedarray.html – 2014-09-03 22:57:31

+0

'[x in index_array for x in range(500)]'這樣做,但用'True'和'False'代替1和0. – genisage 2014-09-03 23:03:16

+0

@genisage你可以請你的評論作爲答案?我想選擇你的。這是我一直在尋找的確切的東西。謝謝你的回答! – Efreeto 2014-09-04 04:47:15

回答

15

這裏有一種方法:

In [1]: index_array = np.array([3, 4, 7, 9]) 

In [2]: n = 15 

In [3]: mask_array = np.zeros(n, dtype=int) 

In [4]: mask_array[index_array] = 1 

In [5]: mask_array 
Out[5]: array([0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0]) 

如果屏蔽始終是一個範圍,可以消除index_array,並分配給1片:

In [6]: mask_array = np.zeros(n, dtype=int) 

In [7]: mask_array[5:10] = 1 

In [8]: mask_array 
Out[8]: array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]) 

如果你想布爾值,而不是整數數組,改變mask_arraydtype創建時:

In [11]: mask_array = np.zeros(n, dtype=bool) 

In [12]: mask_array 
Out[12]: 
array([False, False, False, False, False, False, False, False, False, 
     False, False, False, False, False, False], dtype=bool) 

In [13]: mask_array[5:10] = True 

In [14]: mask_array 
Out[14]: 
array([False, False, False, False, False, True, True, True, True, 
     True, False, False, False, False, False], dtype=bool) 
+0

+1這也是一個非常好的答案,特別是如果有人希望他們的mask_array是一個np.array。 – Efreeto 2014-09-05 05:08:38

+0

它比列表理解更有效率。 – JulienD 2016-01-08 21:50:18

+0

使用int而不是bool有什麼好處嗎?我只是想知道爲什麼答案的最重要部分在問題要求掩碼時不建議使用bool。 – Annan 2018-03-01 00:13:40

-1

按照要求,在這裏它是一個答案。代碼:

[x in index_array for x in range(500)] 

會給你一個像你要求的面具,但它會使用Bools而不是0和1。

+0

請不要低估他。我請他/她作出回答。我會改變接受的答案,所以這個答案不會被低估。 – Efreeto 2018-03-08 02:57:27

2

對於單一維度,請嘗試:

n = (15,) 
index_array = [2, 5, 7] 
mask_array = numpy.zeros(n) 
mask_array[index_array] = 1 

對於多個維度,將您的n維指數爲一維的,然後使用拉威爾:

n = (15, 15) 
index_array = [[1, 4, 6], [10, 11, 2]] # you may need to transpose your indices! 
mask_array = numpy.zeros(n) 
flat_index_array = np.ravel_multi_index(
    index_array, 
    mask_array.shape) 
numpy.ravel(mask_array)[flat_index_array] = 1 
0

有一個不錯的也可以把它作爲一行代碼 - 使用numpy.in1dnumpy.arange這樣的功能(最後一行是關鍵部分):

>>> x = np.linspace(-2, 2, 10) 
>>> y = x**2 - 1 
>>> idxs = np.where(y<0) 

>>> np.in1d(np.arange(len(x)), idxs) 
array([False, False, False, True, True, True, True, False, False, False], dtype=bool) 

這種方法的不足之處在於它比應用Warren Weckesser給出的應用慢大約10-100倍......但它是一個單線程,可能是或者可能不是你想要的。