как работает маскировка с использованием arr [mask, ...]? - PullRequest
0 голосов
/ 11 мая 2018

Я прочитал в numpy.delete документацию, в которой указан массив обрчто делает arr[mask,...], и я проверил, как это работает, и могу использовать это для маскировки массивов.Но мне просто интересно, что это за синтаксис arr[mask,...]?т.е. как мне использовать этот синтаксис вообще?

1 Ответ

0 голосов
/ 11 мая 2018

Сначала убедитесь, что мы понимаем 1d случай:

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