Я читал документацию по маскированному массиву, и я запутался - что отличается от 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? И позволяет ли избежать копирования под капот при применении маски к данным? Есть ли другие преимущества?