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
的一个子类,它增加了掩码功能,即在计算过程中忽略或隐藏某些数组值的能力。
虽然历史上将此类分发在 NumPy 内部很方便,但改进的打包使其能够轻松地单独分发。
此举的动机包括
重点:NumPy 包应努力仅包含 ndarray 对象以及操作此类数组所需的必要实用程序。
复杂性:MaskedArray 实现并非易事,并且带来了巨大的维护负担。
兼容性:MaskedArray 对象作为 ndarray 的子类[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 版本上 导入 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 将保留在其当前位置,至少直到新的掩码数组类实现并经过实际测试。
参考文献和脚注#
版权#
本文档已进入公共领域。