2014-09-03 64 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倍......但它是一个单线程,可能是或者可能不是你想要的。