NEP 17 — 拆分屏蔽数组#

作者

斯特凡·范德沃尔特< stefanv @伯克利教育>

地位

拒绝

类型

标准轨道

创建

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或通过他们的包管理器安装它。随后,在完整包含 maskedarray 的 NumPy 版本上导入 maskedarray将引发ImportError

文档#

NumPy 的内部文档在某些地方明确引用了 MaskedArrays,例如ndarray.concatenate

> 当要连接的一个或多个数组是 MaskedArray 时, > 此函数将返回一个 MaskedArray 对象而不是 ndarray, > 但输入掩码不会保留。如果需要 MaskedArray > 作为输入,请改用 masked > array 模块中的 ma.concatenate 函数。

此类文档将被删除,因为期望maskedarray的用户将使用该包中的方法来操作 MaskedArray。

其他出场#

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

  • numpygenfromtext

  • numpy.libmerge_arrays , numpy.lib.stack_arrays

向后兼容性#

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

另请注意,类数组对象上的新 PEP 最终可能会为 MaskedArray 提供比当前可用的更好的支持。

备择方案

经过邮件列表上的热烈讨论:

  • 人们支持(并且积极感兴趣)制作更好的掩码数组类。

  • 新类应该是外部 NumPy API 的使用者,没有特殊的地位(不像今天,代码库中有一些 hack 来支持它)

  • MaskedArray将保留在原来的位置,至少直到新的屏蔽数组类实现并在野外进行尝试为止。

参考文献和脚注#