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` 子包重构为一个新的可 pip 安装的库,称为 `maskedarray` [2],它将以类似的方式使用。

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 的情况下,请改用 masked 数组模块中的 ma.concatenate 函数。

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

其他出现情况#

将从以下位置删除显式 MaskedArray 支持

  • numpygenfromtext

  • `numpy.libmerge_arrays`,`numpy.lib.stack_arrays`

向后兼容性#

对于 NumPy 的两个版本,除了弃用通知之外,不会出现用户可见的更改。此后,`np.ma` 将不再可用(相反,MaskedArrays 将位于 `maskedarray` 包中)。

另请注意,关于类数组对象的新的 PEP 最终可能比当前可用功能更好地支持 MaskedArrays。

替代方案#

在邮件列表中进行了热烈的讨论之后

  • 有支持(并且有积极的兴趣)创建更好的掩码数组类。

  • 新类应成为外部 NumPy API 的使用者,没有特殊状态(与今天不同,在代码库中存在一些黑客手段来支持它)

  • `MaskedArray` 将保留在原处,至少直到新掩码数组类出现并在现实世界中得到尝试。

参考文献和脚注#