NEP 17 — 分离掩码数组#

作者:

Stéfan van der Walt <stefanv@berkeley.edu>

状态:

已拒绝

类型:

标准跟踪

创建:

2018-03-22

决议:

https://mail.python.org/pipermail/numpy-discussion/2018-May/078026.html

摘要#

此 NEP 提出从 NumPy 中删除 MaskedArray 功能,并将其作为独立包发布。

详细描述#

MaskedArrays 是 NumPy ndarray 的子类,它添加了掩码功能,即在计算过程中忽略或隐藏某些数组值的能力。

虽然在历史上将此类在 NumPy 内发布很方便,但改进的打包使其能够单独发布而不会遇到困难。

此举的动机包括

  • 重点:NumPy 包应努力仅包含 ndarray 对象,以及操作此类数组所需的必要实用程序。

  • 复杂性:MaskedArray 实现是非平凡的,并且会带来重大的维护负担。

  • 兼容性:MaskedArray 对象作为 ndarrays 的子类 [1],在与其他包一起使用时经常会导致问题。解决这些问题超出了 NumPy 开发的范围。

此 NEP 提出了一条弃用路径,通过该路径,用户仍然可以访问 MaskedArrays,但不再作为核心包的一部分。

实现#

目前,MaskedArray 的创建方式如下

from numpy import ma
ma.array([1, 2, 3], mask=[True, False, True])

这将返回一个数组,其中值 1 和 3 被屏蔽(对诸如 np.sum 之类的操作不再可见)。

我们建议将 np.ma 子包重构为一个名为 maskedarray [2] 的新可通过 pip 安装的库,该库将以类似的方式使用

import maskedarray as ma
ma.array([1, 2, 3], mask=[True, False, True])

对于 NumPy 的两个版本,maskedarray 将成为 NumPy 的依赖项,并将以现有名称 np.ma 公开 MaskedArrays。如果作为 np.ma 导入,将引发 NumpyDeprecationWarning,描述即将到来的弃用以及有关如何修改代码以使用 maskedarray 的说明。

在两个版本之后,np.ma 将被完全删除。为了获得 np.ma,用户将通过 pip install 或通过他们的包管理器安装它。随后,在包含它的完整版本的 NumPy 上 导入 maskedarray 将引发 ImportError

文档#

NumPy 的内部文档在某些地方明确引用 MaskedArrays,例如 ndarray.concatenate

> 当要连接的一个或多个数组是 MaskedArray 时,> 此函数将返回 MaskedArray 对象而不是 ndarray,> 但输入掩码不会保留。在期望 MaskedArray 作为输入的情况下,> 使用掩码数组模块中的 ma.concatenate 函数。

此类文档将被删除,因为预期 maskedarray 的用户将使用该包中的方法来操作 MaskedArrays。

其他出现#

将从以下方面删除显式的 MaskedArray 支持

  • numpygenfromtext

  • numpy.libmerge_arraysnumpy.lib.stack_arrays

向后兼容性#

对于 NumPy 的两个版本,除了弃用通知外,用户不会看到任何变化。此后,np.ma 将不再可用(相反,MaskedArrays 将存在于 maskedarray 包中)。

另请注意,关于类数组对象的新的 PEP 最终可能会为 MaskedArrays 提供比目前更好的支持。

替代方案#

在邮件列表上进行热烈讨论之后

  • 支持(并且对创建更好的新的掩码数组类非常感兴趣)。

  • 新类应该使用外部 NumPy API,没有任何特殊状态(与今天不同,今天代码库中存在支持它的 hack)。

  • MaskedArray 将保留在它所在的位置,至少直到新的掩码数组类出现并已在现实世界中得到尝试。

参考资料和脚注#