NumPy 1.22.0 發行說明#

NumPy 1.22.0 是一個大型發行版本,匯集了 153 位貢獻者的努力,遍布 609 個提取請求。其中有許多改進,重點如下:

  • 主命名空間的註解基本上已完成。上游是一個變動的目標,因此可能會有進一步的改進,但主要工作已完成。這可能是此版本中最明顯的使用者可見增強功能。

  • 提供了建議的 Array-API 的初步版本。這是創建可在 CuPy 和 JAX 等應用程式中使用的標準函數集合的一個步驟。

  • NumPy 現在具有 DLPack 後端。DLPack 為陣列(張量)資料提供了一種通用的交換格式。

  • 用於 quantilepercentile 和相關函數的新方法。新方法提供了一組完整的文獻中常見的方法。

  • 通用函數已重構,以實作大部分的 NEP 43。這也解鎖了實驗未來 DType API 的能力。

  • 一個新的可配置分配器,供下游專案使用。

除了正在進行的工作,為常用函數提供 SIMD 支援、改進 F2PY 以及更好的文件之外,還有這些。

此版本中支援的 Python 版本為 3.8-3.10,已移除 Python 3.7。請注意,Mac 映像檔現在基於 OS X 10.14 而不是先前 NumPy 發行週期中使用的 10.9。10.14 是 Apple 支援的最舊版本。另請注意,32 位元映像檔僅針對 Windows 上的 Python 3.8 和 3.9 提供,所有其他映像檔均為 64 位元,因為 Ubuntu、Fedora 和其他 Linux 發行版本已放棄 32 位元支援。所有 64 位元映像檔也與 64 位元整數 OpenBLAS 連結,這應能解決使用真正龐大陣列的人員偶爾遇到的問題。

已過期的棄用#

已移除已棄用的數值樣式 dtype 字串#

將字串 "Bytes0""Datetime64""Str0""Uint32""Uint64" 用作 dtype 現在會引發 TypeError

(gh-19539)

npyio 中 loadsndfromtxtmafromtxt 的已過期棄用#

numpy.loads 已在 v1.15 中棄用,建議使用者改用 pickle.loadsndfromtxtmafromtxt 均在 v1.17 中棄用 - 使用者應改用 numpy.genfromtxt,並為 usemask 參數設定適當的值。

(gh-19615)

棄用#

在 mrecords 中使用 delimiter 而非 delimitor 作為 kwarg#

numpy.ma.mrecords.fromtextfile() 的拼寫錯誤關鍵字引數 delimitor 已變更為 delimiter,使用它將發出棄用警告。

(gh-19921)

將布林值 kth 值傳遞給 (arg-)partition 已棄用#

numpy.partitionnumpy.argpartition 之前會接受 kth 參數的布林值,隨後會將其轉換為整數。此行為現在已棄用。

(gh-20000)

np.MachAr 類別已棄用#

numpy.MachAr 類別和 finfo.machar <numpy.finfo> 屬性已棄用。鼓勵使用者直接從對應的 numpy.finfo 屬性存取感興趣的屬性。

(gh-20201)

相容性注意事項#

Distutils 在 clang 上強制執行嚴格的浮點模型#

NumPy 現在在 clang 上設定 -ftrapping-math 選項,以強制執行通用函數的正確浮點錯誤處理。否則,Clang 預設為非 IEEE 和 C99 相容行為。NumPy 1.21 中嘗試了此變更(使用等效但較新的 -ffp-exception-behavior=strict),但實際上從未使用過。

(gh-19479)

已移除複數類型的 floor division 支援#

複數類型的 Floor division 現在將導致 TypeError

>>> a = np.arange(10) + 1j* np.arange(10)
>>> a // 1
TypeError: ufunc 'floor_divide' not supported for the input types...

(gh-19135)

numpy.vectorize 函數現在產生與基礎函數相同的輸出類別#

當使用 numpy.vectorize 將尊重 numpy.ndarray 子類別的函數向量化時,向量化函數現在也將針對給定簽名的情況(即,在建立 gufunc 時)是子類別安全的:輸出類別將與第一次呼叫基礎函數傳回的類別相同。

(gh-19356)

不再支援 Python 3.7#

已放棄 Python 支援。這是相當嚴格的,有些變更需要 Python >= 3.8。

(gh-19665)

複數 dtype 的 str/repr 現在在標點符號後包含空格#

np.dtype({"names": ["a"], "formats": [int], "offsets": [2]}) 的 repr 現在是 dtype({'names': ['a'], 'formats': ['<i8'], 'offsets': [2], 'itemsize': 10}),而冒號後和欄位之間的空格先前被省略。

可以使用 np.set_printoptions(legacy="1.21") 還原舊行為。

(gh-19687)

已修正 PCG64DSXMPCG64 中的 advance#

修正了 PCG64DSXMPCG64advance 方法中的錯誤。僅當步長大於 \(2^{64}\) 且平台不支援 128 位元整數(例如,Windows 和 32 位元 Linux)時,此錯誤才會影響結果。

(gh-20049)

隨機 32 位元浮點變數產生的變更#

從均勻分佈產生 32 位元浮點值的過程中存在一個錯誤,這會導致隨機變數的最低有效位元始終為 0。此問題已修正。

此變更會影響 random.Generator 方法 randomstandard_normalstandard_exponentialstandard_gamma 產生的變數,但僅當 dtype 指定為 numpy.float32 時。

(gh-20314)

C API 變更#

遮罩內部迴圈無法再自訂#

遮罩內部迴圈選取器現在永遠不會使用。在不太可能發生的自訂情況下,將會發出警告。

我們預期沒有任何程式碼使用它。如果您確實使用它,則必須在新版 NumPy 上取消設定選取器。另請聯絡 NumPy 開發人員,我們確實預期會提供一種新的、更具體的機制。

自訂是從未實作的功能的一部分,旨在加速遮罩運算。

(gh-19259)

未來 DType 和 UFunc API 的實驗性公開#

新的標頭 experimental_public_dtype_api.h 允許實驗未來 API,以改進通用函數,尤其是使用者 DType 支援。此時,建議使用 NumPy 的開發版本進行實驗,因為預計會有一些變更,並且將解鎖新功能。

(gh-19919)

新功能#

NEP 49 可配置分配器#

NEP 49 中詳述,可用於分配 ndarray 資料區段的函數可以變更。策略可以全域或在內容中設定。如需更多資訊,請參閱 NEP 和 NumPy 中的記憶體管理 參考文件。同時新增 NUMPY_WARN_IF_NO_MEM_POLICY 覆寫,以在危險地使用轉移所有權(透過設定 NPY_ARRAY_OWNDATA)時發出警告。

(gh-17582)

NEP 47 的實作(採用陣列 API 標準)#

已新增 NEP 47(採用陣列 API 標準)的初始實作,作為 numpy.array_api。此實作是實驗性的,並且在匯入時會發出 UserWarning,因為 陣列 API 標準 仍處於草稿狀態。numpy.array_api 是陣列 API 標準的相容實作,它也是最小的,這表示僅實作標準要求的那些函數和行為(請參閱 NEP 以取得更多資訊)。鼓勵希望使用陣列 API 標準的程式庫使用 numpy.array_api 來檢查它們是否僅使用保證在標準相容實作中存在的功能。

(gh-18585)

現在可以從註解區塊產生 C/C++ API 參考文件#

此功能取決於產生過程中的 Doxygen 和與 Sphinx 整合的 Breathe

(gh-18884)

透過 mypy 外掛程式指派平台特定的 c_intp 精確度#

mypy 外掛程式(在 numpy/numpy#17843 中引入)已再次擴充:外掛程式現在負責設定 numpy.ctypeslib.c_intp 的平台特定精確度,後者用作各種 numpy.ndarray.ctypes 屬性的資料類型。

如果沒有外掛程式,則上述類型將預設為 ctypes.c_int64

若要啟用外掛程式,必須將其新增至其 mypy 組態檔

[mypy]
plugins = numpy.typing.mypy_plugin

(gh-19062)

新增與 NEP 47 相容的 dlpack 支援#

新增 ndarray.__dlpack__() 方法,該方法傳回包裝在 PyCapsule 中的 dlpack C 結構。同時新增 np._from_dlpack(obj) 函數,其中 obj 支援 __dlpack__(),並傳回 ndarray

(gh-19083)

keepdims 選用引數已新增至 numpy.argminnumpy.argmax#

keepdims 引數已新增至 numpy.argminnumpy.argmax。如果設定為 True,則縮減的軸將保留在結果中,作為大小為 1 的維度。產生的陣列具有相同的維度數,並將與輸入陣列廣播。

(gh-19211)

bit_count 用於計算整數中 1 位元的數量#

計算輸入絕對值中 1 位元的數量。這適用於所有 numpy 整數類型。類似於內建 int.bit_count 或 C++ 中的 popcount

>>> np.uint32(1023).bit_count()
10
>>> np.int32(-127).bit_count()
7

(gh-19355)

已將 ndimaxis 屬性新增至 numpy.AxisError#

ndimaxis 參數現在也儲存為每個 numpy.AxisError 執行個體內的屬性。

(gh-19459)

初步支援 windows/arm64 目標#

numpy 新增了對 windows/arm64 目標的支援。請注意,OpenBLAS 支援尚不適用於 windows/arm64 目標。

(gh-19513)

新增 LoongArch 的支援#

LoongArch 是一種新的指令集,numpy 在 LoongArch 架構上的編譯失敗,因此新增提交。

(gh-19527)

已新增 .clang-format 檔案#

Clang-format 是一種 C/C++ 程式碼格式器,連同新增的 .clang-format 檔案,它產生的程式碼與一般用途的 NumPy C_STYLE_GUIDE 非常接近。由於使用了幾項新功能,因此需要 Clang-format 12+ 版本,它在 Fedora 34 和 Ubuntu Focal 以及其他發行版本中可用。

(gh-19754)

is_integer 現在可用於 numpy.floatingnumpy.integer#

基於 Python floatint 中的對應項,numpy 浮點和整數類型現在支援 float.is_integer。如果數字是有限的且具有整數值,則傳回 True,否則傳回 False

>>> np.float32(-2.0).is_integer()
True
>>> np.float64(3.2).is_integer()
False
>>> np.int32(-2).is_integer()
True

(gh-19803)

Fortran 維度規格的符號剖析器#

已在 f2py 中新增一個新的符號剖析器,以便正確剖析維度規格。此剖析器是未來改進的基礎,並提供與 Draft Fortran 202x 的相容性。

(gh-19805)

ndarraydtypenumber 現在可在執行階段進行下標#

模仿 PEP 585numpy.ndarraynumpy.dtypenumpy.number 類別現在可針對 python 3.9 及更高版本進行下標。因此,先前僅允許在 .pyi Stub 檔案中或在 from __future__ import annotations 協助下使用的運算式現在在執行階段也是合法的。

>>> import numpy as np
>>> from typing import Any

>>> np.ndarray[Any, np.dtype[np.float64]]
numpy.ndarray[typing.Any, numpy.dtype[numpy.float64]]

(gh-19879)

改進#

ctypeslib.load_library 現在可以接受任何路徑類物件#

中的所有參數現在都可以接受任何 路徑類物件。這包括字串、位元組和實作 __fspath__ 通訊協定的物件。

(gh-17530)

新增 smallest_normalsmallest_subnormal 屬性至 finfo#

屬性 smallest_normalsmallest_subnormal 可作為任何浮點資料類型的 finfo 類別的擴充功能使用。若要使用這些新屬性,請寫入 np.finfo(np.float64).smallest_normalnp.finfo(np.float64).smallest_subnormal

(gh-18536)

numpy.linalg.qr 接受堆疊矩陣作為輸入#

numpy.linalg.qr 能夠為堆疊矩陣產生結果作為輸入。此外,QR 分解的實作已從 Python 移至 C。

(gh-19151)

numpy.fromregex 現在接受 os.PathLike 實作#

numpy.fromregex 現在接受實作 __fspath__<os.PathLike> 通訊協定的物件,例如 pathlib.Path

(gh-19680)

quantilepercentile 新增方法#

quantilepercentile 現在具有支援 13 種不同方法的 method= 關鍵字引數。這取代了 interpolation= 關鍵字引數。

這些方法現在與科學文獻和 R 語言中可以找到的九種方法對齊。其餘方法是先前預設「線性」方法的不連續變體。

請參閱 numpy.percentile 的文件以取得更多資訊。

(gh-19857)

遺失的參數已新增至 nan<x> 函數#

許多 nan<x> 函數先前缺少其基於 <x> 的對應項中存在的參數,例如where 參數存在於 numpy.mean 中,但不存在於 numpy.nanmean 中。

以下參數現在已新增至 nan<x> 函數

  • nanmin:initial & where

  • nanmax:initial & where

  • nanargmin:keepdims & out

  • nanargmax:keepdims & out

  • nansum:initial & where

  • nanprod:initial & where

  • nanmean:where

  • nanvar:where

  • nanstd:where

(gh-20027)

註解主 Numpy 命名空間#

從 1.20 版本開始,NumPy 函式庫的部分內容已包含 PEP 484 類型註解;其餘函式的註解工作仍在進行中。隨著 1.22 版本的發布,主 NumPy 命名空間的此流程已完成,現在已完全註解。

除了主命名空間之外,少數子套件也包含註解。其中包括 numpy.testingnumpy.linalgnumpy.random(自 1.21 版本起可用)。

(gh-20217)

使用 AVX-512 向量化 umath 模組#

透過利用 Intel Short Vector Math Library (SVML),18 個 umath 函數(exp2log2log10expm1log1pcbrtsincostanarcsinarccosarctansinhcoshtanharcsinharccosharctanh)已使用 AVX-512 指令集針對單精度和雙精度實作進行向量化。此變更目前僅適用於 Linux 使用者和具有 AVX-512 指令集的處理器。它分別為單精度和雙精度函數提供了平均 32 倍和 14 倍的加速。

(gh-19478)

OpenBLAS v0.3.18#

將測試和 wheels 中使用的 OpenBLAS 更新至 v0.3.18

(gh-20058)