用于屏蔽每列单个切片的矢量化方法

时间:2018-08-10 20:12:33

标签: python numpy

我有一个numpy数组:

>>> a = np.arange(20).reshape(5, -1)
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19]])

我有一个按列顺序排列的区域数组,我想为以下对象创建布尔掩码:

idx = np.array([[0,2], [1,3], [2,4], [1,4]])

对于这组索引,我想要的掩码是:

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

因此,列00:2屏蔽了,列11:3屏蔽了,依此类推。我当前的方法有效,但是我正在寻找矢量化的东西:

def foo(a, idx):
    out = np.zeros(a, dtype=np.bool8)
    for (i, j), k in zip(idx, np.arange(a[1])):
        out[i:j, k] = True
    return out

实际情况:

foo(a.shape, idx)

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

1 个答案:

答案 0 :(得分:3)

使用broadcasting-

In [434]: r = np.arange(a.shape[0])[:,None]

In [435]: (idx[:,0] <= r) & (idx[:,1] > r)
Out[435]: 
array([[ True, False, False, False],
       [ True,  True, False,  True],
       [False,  True,  True,  True],
       [False, False,  True,  True],
       [False, False, False, False]])