用于屏蔽每列单个切片的矢量化方法 [英] Vectorized approach for masking individual slices per column

查看:78
本文介绍了用于屏蔽每列单个切片的矢量化方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个numpy数组:

I have a numpy array:

>>> 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]])

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

I have an array of regions going in order of columns, that I would like to create a boolean mask for:

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

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

My desired mask for this set of indices is:

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被屏蔽,依此类推.我当前的方法有效,但是我正在寻找矢量化的东西:

So column 0 has 0:2 masked, column 1 has 1:3 masked, etc. My current approach works, but I am looking for something vectorized:

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]])

推荐答案

使用 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]])

这篇关于用于屏蔽每列单个切片的矢量化方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆