首页 > 解决方案 > 矩阵的numpy布尔索引

问题描述

请放轻松,因为我还是 numpy 的新手,并试图围绕一些 numpy 概念来思考,我有这个问题:

问题

我有一个名为 box 的 numpy 数组boxes.shape = (2, 200, 4)
有2个框,每个框有200个框,每个框有4个坐标点。

我有一个名为 to_keep 的布尔数组to_keep.shape = (2, 200)。对于每一帧,有 200d 数组告诉是否保留该框。

我想过滤掉boxes并只保留那些to_keep真实的。
我得到的形状应该是filtered_boxes.shape = (2, N, 4)

问题是对于第一帧,25 个框可能是有效的。但是对于第二帧,100 个框可能是有效的。

如何在 numpy 中有效地过滤掉这个结构?

标签: pythonnumpy

解决方案


一个数组和布尔掩码:

In [309]: X = np.arange(2*10*3).reshape(2,10,3)

In [314]: mask = np.random.randint(0,2,(2,10)).astype(bool)
In [315]: mask
Out[315]: 
array([[False, False,  True,  True, False,  True,  True,  True,  True,
         True],
       [False,  True,  True,  True, False,  True, False,  True,  True,
        False]])

迭代第一个维度:

In [316]: [x[i,:] for x,i in zip(X,mask)]
Out[316]: 
[array([[ 6,  7,  8],
        [ 9, 10, 11],
        [15, 16, 17],
        [18, 19, 20],
        [21, 22, 23],
        [24, 25, 26],
        [27, 28, 29]]), 
 array([[33, 34, 35],
        [36, 37, 38],
        [39, 40, 41],
        [45, 46, 47],
        [51, 52, 53],
        [54, 55, 56]])]

通常,这样的掩码在每一行中具有不同数量的 True,因此无法将生成的掩码列表重新转换为 3d 数组。


推荐阅读