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 功能,并将其作为一个独立的包发布。
详细描述#
MaskedArray 是 NumPy 的一个子类 ndarray
,它增加了掩码功能,即在计算过程中忽略或隐藏某些数组值的D能力。
尽管在历史上将此类分发到 NumPy 内部很方便,但改进的打包方式使得可以轻松地将其单独分发。
此举的动机包括
聚焦:NumPy 包应力求只包含 ndarray 对象,以及操作此类数组所需的基本工具。
复杂性:MaskedArray 的实现并非微不足道,并带来了沉重的维护负担。
兼容性:MaskedArray 对象作为 ndarrays 的子类 [1],在使用其他包时常会引起复杂问题。解决这些问题超出了 NumPy 开发的范围。
本 NEP 提出了一条弃用路径,通过该路径,用户仍然可以访问 MaskedArray,但它不再是核心包的一部分。
实现#
目前,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 公开 MaskedArray。如果以 np.ma 导入,将引发一个 NumpyDeprecationWarning,描述即将进行的弃用以及如何修改代码以使用 maskedarray 的说明。
在两个版本之后,np.ma 将被完全移除。为了获取 np.ma,用户需要通过 pip install 或通过其包管理器安装它。随后,在包含该集成的 NumPy 版本上 importing maskedarray 将引发 ImportError。
文档#
NumPy 的内部文档在某些地方明确提到了 MaskedArray,例如 ndarray.concatenate
> 当一个或多个要连接的数组是 MaskedArray 时, > 此函数将返回一个 MaskedArray 对象而不是 ndarray, > 但输入掩码不会被保留。在期望 MaskedArray > 作为输入的情况下,请改用掩码数组模块中的 ma.concatenate 函数。
此类文档将被移除,因为预计 maskedarray 的用户将使用该包中的方法来操作 MaskedArray。
其他出现位置#
MaskedArray 的明确支持将从以下内容中移除:
numpygenfromtext
numpy.libmerge_arrays, numpy.lib.stack_arrays
向后兼容性#
在 NumPy 的两个版本中,除了弃用通知外,将不会有用户可见的变化。此后,np.ma 将不再可用(取而代之的是,MaskedArray 将存在于 maskedarray 包中)。
另请注意,关于类数组对象的新 PEP 最终可能会为 MaskedArray 提供比当前更好的支持。
替代方案#
经过邮件列表上的激烈讨论
(并且积极地)支持创建更好新的掩码数组类。
新类应是外部 NumPy API 的使用者,不具有特殊地位(不像今天,代码库中存在各种 hack 来支持它)
MaskedArray 将保留在原地,至少直到新的掩码数组类实现并在实践中得到验证。
参考文献和脚注#
版权#
本文档已进入公共领域。