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