Свернуть массив масок вдоль оси - Numpy в Python - PullRequest
0 голосов
/ 14 января 2019

У меня есть двумерный массив масок, который я хочу свернуть вдоль оси 0, используя логическую операцию ИЛИ для значений, которые True. Мне было интересно, есть ли функция numpy, чтобы сделать этот процесс. Мой код выглядит примерно так:

>>> all_masks
array([[False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       [False,  True, False, ..., False,  True, False],
       [False, False, False, ..., False, False, False],
       [False,  True, False, ..., False,  True, False]])

>>> all_masks.shape
(6, 870)

>>> output_mask
array([False, True, False, ..., False, True, False])

>>> output_mask.shape
(870,)

Я достиг output_mask этого процесса с помощью цикла for. Однако я знаю, что использование цикла for делает мой код медленнее (и немного запутанным), поэтому мне было интересно, можно ли завершить этот процесс с помощью функции numpy или аналогичным образом?

Код для использования свертывающих масок для цикла:

mask_out = np.zeros(all_masks.shape[1], dtype=bool)
for mask in all_masks:
    mask_out = mask_out | mask

return mask_out

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Вы можете использовать ndarray.any:

all_masks = np.array([[False, False, False, False, False, False],
                      [False, False, False, False, False, False],
                      [False, False, False, False, False, False],
                      [False,  True, False, False,  True, False],
                      [False, False, False, False, False, False],
                      [False,  True, False, False,  True, False]])

all_masks.any(axis=0)

Выход:

array([False,  True, False, False,  True, False])
0 голосов
/ 14 января 2019

Вы можете использовать np.logical_or.reduce:

In [200]: all_masks = np.array([[False, False, False, False, False, False],
       [False, False, False, False, False, False],
       [False, False, False, False, False, False],
       [False,  True, False, False,  True, False],
       [False, False, False, False, False, False],
       [False,  True, False, False,  True, False]])

In [201]: np.logical_or.reduce(all_masks, axis=0)
Out[207]: array([False,  True, False, False,  True, False])

np.logical_or - это ufunc , и у каждого ufunc есть метод уменьшения .

...