使用 arr[mask, ...] 的 numpy 掩码如何工作?

how does numpy masking using arr[mask, ...] work?

我在 numpy.delete 文档中读到给定数组 arr:

mask = np.ones(len(arr), dtype=bool)
mask[[0,2,4]] = False
result = arr[mask,...]

等同于np.delete(arr, [0,2,4], axis=0),但允许进一步使用掩码。

从这里我可以看到 arr[mask,...] 做了什么,我已经测试了它是如何工作的并且能够使用它来屏蔽数组。但我很好奇,这个 arr[mask,...] 语法到底是什么?即我通常如何使用此语法?

首先确保我们了解一维案例:

In [106]: arr = np.arange(10)
In [107]: mask = np.ones(arr.shape, bool)
In [108]: mask[[0,2,3,7]] = 0
In [109]: mask
Out[109]: 
array([False,  True, False, False,  True,  True,  True, False,  True,
        True])
In [110]: arr[mask]
Out[110]: array([1, 4, 5, 6, 8, 9])

len(arr)位,[mask,...]增加了一点复杂性,我仍然需要解决。

实现这种删除的实际代码是:

    slobj = [slice(None)]*ndim
    N = arr.shape[axis]
    ...
    keep = ones(N, dtype=bool)
    ...
    keep[obj, ] = False
    slobj[axis] = keep
    new = arr[slobj]

因此在示例中:

In [112]: arr = np.arange(10).reshape(5,2)
In [113]: arr
Out[113]: 
array([[0, 1],
       [2, 3],
       [4, 5],
       [6, 7],
       [8, 9]])
In [114]: slobj = [slice(None), slice(None)]
In [115]: mask = np.ones(5,bool)
In [116]: mask[[0,2,4]] = 0
In [117]: mask
Out[117]: array([False,  True, False,  True, False])
In [118]: slobj[0] = mask
In [119]: slobj
Out[119]: [array([False,  True, False,  True, False]), slice(None, None, None)]
In [120]: arr[slobj]
Out[120]: 
array([[2, 3],
       [6, 7]])