Почему маскированные массивы Numpy полезны? - PullRequest
1 голос
/ 05 мая 2019

Я читал документацию по маскированному массиву, и я запутался - что отличается от MaskedArray, чем просто поддержание массива значений и логической маски? Может кто-нибудь привести пример, когда MaskedArrays более удобны или более эффективны?

Обновление 6/5

Чтобы быть более конкретным в моем вопросе, вот классический пример использования MaskedArray:

>>>data = np.arange(12).reshape(3, 4)
>>>mask = np.array([[0., 0., 1., 0.],
                    [0., 0., 0., 1.],
                    [0., 1., 0., 0.]])

>>>masked = np.ma.array(data, mask=mask)
>>>masked

masked_array(
  data=[[0, 1, --, 3],
        [4, 5, 6, --],
        [8, --, 10, 11]],
  mask=[[False, False,  True, False],
        [False, False, False,  True],
        [False,  True, False, False]],
  fill_value=999999)

>>>masked.sum(axis=0)

masked_array(data=[12, 6, 16, 14], mask=[False, False, False, False], fill_value=999999)

Я мог бы так же легко сделать то же самое следующим образом:

>>>data = np.arange(12).reshape(3, 4).astype(float)
>>>mask = np.array([[0., 0., 1., 0.],
                    [0., 0., 0., 1.],
                    [0., 1., 0., 0.]]).astype(bool)

>>>masked = data.copy()  # this keeps the original data reuseable, as would
                         # the MaskedArray. If we only need to perform one 
                         # operation then we could avoid the copy
>>>masked[mask] = np.nan
>>>np.nansum(masked, axis=0)

array([12.,  6., 16., 14.])

Полагаю, версия MaskedArray выглядит немного лучше и позволяет избежать копирования, если вам нужен повторно используемый массив. Разве он не использует столько же памяти при конвертации из стандартного ndarray в MaskedArray? И позволяет ли избежать копирования под капот при применении маски к данным? Есть ли другие преимущества?

...