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_arrays、numpy.lib.stack_arrays
向后兼容性#
对于 NumPy 的两个版本,除了弃用通知外,用户不会看到任何变化。此后,np.ma 将不再可用(相反,MaskedArrays 将存在于 maskedarray 包中)。
另请注意,关于类数组对象的新的 PEP 最终可能会为 MaskedArrays 提供比目前更好的支持。
替代方案#
在邮件列表上进行热烈讨论之后
支持(并且对创建更好的新的掩码数组类非常感兴趣)。
新类应该使用外部 NumPy API,没有任何特殊状态(与今天不同,今天代码库中存在支持它的 hack)。
MaskedArray 将保留在它所在的位置,至少直到新的掩码数组类出现并已在现实世界中得到尝试。
参考资料和脚注#
版权#
本文档已置于公共领域。