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` 将保留在原处,至少直到新掩码数组类出现并在现实世界中得到尝试。
参考文献和脚注#
版权#
本文已放置到公共领域。