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 的新 pip 可安裝程式庫[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 版本上 importing 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 的消費者,沒有特殊狀態(與今天在整個程式碼庫中都有 hack 來支援它不同)

  • MaskedArray 將保留在原位,至少直到新的遮罩陣列類別實現並在野外試用過。

參考文獻和腳註#