NumPy 1.22.0 發行說明#
NumPy 1.22.0 是一個大型發行版本,匯集了 153 位貢獻者的努力,遍布 609 個提取請求。其中有許多改進,重點如下:
主命名空間的註解基本上已完成。上游是一個變動的目標,因此可能會有進一步的改進,但主要工作已完成。這可能是此版本中最明顯的使用者可見增強功能。
提供了建議的 Array-API 的初步版本。這是創建可在 CuPy 和 JAX 等應用程式中使用的標準函數集合的一個步驟。
NumPy 現在具有 DLPack 後端。DLPack 為陣列(張量)資料提供了一種通用的交換格式。
用於
quantile
、percentile
和相關函數的新方法。新方法提供了一組完整的文獻中常見的方法。通用函數已重構,以實作大部分的 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 中 loads
、ndfromtxt
和 mafromtxt
的已過期棄用#
numpy.loads
已在 v1.15 中棄用,建議使用者改用 pickle.loads
。ndfromtxt
和 mafromtxt
均在 v1.17 中棄用 - 使用者應改用 numpy.genfromtxt
,並為 usemask
參數設定適當的值。
(gh-19615)
棄用#
在 mrecords 中使用 delimiter 而非 delimitor 作為 kwarg#
numpy.ma.mrecords.fromtextfile()
的拼寫錯誤關鍵字引數 delimitor
已變更為 delimiter
,使用它將發出棄用警告。
(gh-19921)
將布林值 kth
值傳遞給 (arg-)partition 已棄用#
numpy.partition
和 numpy.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)
已修正 PCG64DSXM
和 PCG64
中的 advance
#
修正了 PCG64DSXM
和 PCG64
的 advance
方法中的錯誤。僅當步長大於 \(2^{64}\) 且平台不支援 128 位元整數(例如,Windows 和 32 位元 Linux)時,此錯誤才會影響結果。
(gh-20049)
隨機 32 位元浮點變數產生的變更#
從均勻分佈產生 32 位元浮點值的過程中存在一個錯誤,這會導致隨機變數的最低有效位元始終為 0。此問題已修正。
此變更會影響 random.Generator
方法 random
、standard_normal
、standard_exponential
和 standard_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.argmin
、numpy.argmax
#
keepdims
引數已新增至 numpy.argmin
、numpy.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)
已將 ndim
和 axis
屬性新增至 numpy.AxisError
#
ndim
和 axis
參數現在也儲存為每個 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.floating
和 numpy.integer
#
基於 Python float
和 int
中的對應項,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)
ndarray
、dtype
和 number
現在可在執行階段進行下標#
模仿 PEP 585,numpy.ndarray
、numpy.dtype
和 numpy.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_normal
和 smallest_subnormal
屬性至 finfo
#
屬性 smallest_normal
和 smallest_subnormal
可作為任何浮點資料類型的 finfo
類別的擴充功能使用。若要使用這些新屬性,請寫入 np.finfo(np.float64).smallest_normal
或 np.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)
為 quantile
和 percentile
新增方法#
quantile
和 percentile
現在具有支援 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.testing
、numpy.linalg
和 numpy.random
(自 1.21 版本起可用)。
(gh-20217)
使用 AVX-512 向量化 umath 模組#
透過利用 Intel Short Vector Math Library (SVML),18 個 umath 函數(exp2
、log2
、log10
、expm1
、log1p
、cbrt
、sin
、cos
、tan
、arcsin
、arccos
、arctan
、sinh
、cosh
、tanh
、arcsinh
、arccosh
、arctanh
)已使用 AVX-512 指令集針對單精度和雙精度實作進行向量化。此變更目前僅適用於 Linux 使用者和具有 AVX-512 指令集的處理器。它分別為單精度和雙精度函數提供了平均 32 倍和 14 倍的加速。
(gh-19478)
OpenBLAS v0.3.18#
將測試和 wheels 中使用的 OpenBLAS 更新至 v0.3.18
(gh-20058)