NumPy 2.0.0 發行說明#

NumPy 2.0.0 是自 2006 年以來的第一個主要版本。它是自上次功能版本發布以來 11 個月開發的成果,並且是 212 位貢獻者在 1078 個 pull request 中共同努力的成果。它包含大量令人興奮的新功能,以及 Python 和 C API 的變更。

這個主要版本包含在常規次要(功能)版本中不會發生的重大變更 - 包括 ABI 破壞、型別提升規則的變更,以及在 1.26.x 中可能未發出棄用警告的 API 變更。除了這些發行說明之外,關於如何適應 NumPy 2.0 變更的關鍵文件包括

重點#

此版本的重點包括

  • 新功能

    • 一個新的變長字串 dtype,StringDType 和一個新的 numpy.strings 命名空間,其中包含用於字串操作的高效能 ufunc,

    • 在所有 numpy.fft 函數中支援 float32longdouble

    • 在主要的 numpy 命名空間中支援陣列 API 標準。

  • 效能改進

    • 排序函數(sortargsortpartitionargpartition)已透過使用 Intel x86-simd-sort 和 Google Highway 函式庫加速,並且可能會看到大幅(硬體特定的)速度提升,

    • macOS Accelerate 支援和適用於 macOS >=14 的二進位 wheel,在 macOS 上進行線性代數運算時具有顯著的效能改進,並且 wheel 大約小 3 倍,

    • 透過實作也支援 StringDType 以及固定長度字串 dtype 的 ufunc,numpy.char 固定長度字串操作已獲得加速,

    • 一個新的追蹤和內省 API,opt_func_info,用於確定哪些硬體特定的核心可用且將被調度。

    • numpy.save 現在使用 pickle 協定版本 4 來儲存具有 object dtype 的陣列,這允許大於 4GB 的 pickle 物件,並將大型陣列的儲存速度提高約 5%。

  • Python API 改進

    • 公開和私有 API 之間有明確的劃分,具有新的 模組結構,並且每個公共函數現在都可以在單一位置使用,

    • 許多已移除不建議使用的函數和別名。這應該使學習和使用 NumPy 更加容易。主要命名空間中的物件數量減少了約 10%,而 numpy.lib 中的物件數量減少了約 80%,

    • 標準 dtype 名稱 和一個新的 isdtype 內省函數,

  • C API 改進

  • 行為改進

    • 透過採用 NEP 50,型別提升行為的改進已獲得變更。這修正了許多使用者對於提升的驚訝,這些提升先前通常取決於輸入陣列的資料值,而不僅僅是它們的 dtype。由於此變更可能會導致輸出 dtype 的變更以及混合 dtype 操作的較低精確度結果,請參閱 NEP 和 NumPy 2.0 遷移指南 以瞭解詳細資訊。

    • Windows 上的預設整數型別現在是 int64 而不是 int32,與其他平台上的行為一致,

    • 陣列維度的最大數量已從 32 變更為 64

  • 文件

此外,NumPy 內部結構還有許多變更,包括繼續將程式碼從 C 遷移到 C++,這將使未來更容易改進和維護 NumPy。

「天下沒有白吃的午餐」定理表明,所有這些 API 和行為改進以及更好的未來可擴展性都是有代價的。這個代價是

  1. 向後相容性。Python 和 C API 都有大量的重大變更。在大多數情況下,都有明確的錯誤訊息會告知使用者如何調整他們的程式碼。但是,也存在一些行為變更,對於這些變更,無法提供此類錯誤訊息 - 這些情況都在下面的「棄用和相容性」章節以及 NumPy 2.0 遷移指南 中涵蓋。

    請注意,有一個 ruff 模式可以自動修復 Python 程式碼中的許多問題。

  2. NumPy ABI 的重大變更。因此,使用 NumPy C API 並針對 NumPy 1.xx 版本建置的套件二進位檔將無法與 NumPy 2.0 搭配使用。在匯入時,這些套件將會看到 ImportError,並顯示關於二進位不相容性的訊息。

    可以針對 NumPy 2.0 建置二進位檔,這些二進位檔在執行時可與 NumPy 2.0 和 1.x 搭配使用。有關更多詳細資訊,請參閱 NumPy 2.0 特定建議

    建議所有依賴 NumPy ABI 的下游套件發布針對 NumPy 2.0 建置的新版本,並驗證該版本可與 2.0 和 1.26 搭配使用 - 理想情況是在 2.0.0rc1(將是 ABI 穩定的版本)和最終 2.0.0 發行版本之間的期間進行驗證,以避免使用者的問題。

此版本支援的 Python 版本為 3.9-3.12。

NumPy 2.0 Python API 移除#

  • np.geterrobjnp.seterrobj 和相關的 ufunc 關鍵字引數 extobj= 已被移除。所有這些的首選替代方案是使用上下文管理器 with np.errstate():

    (gh-23922)

  • np.cast 已被移除。np.cast[dtype](arg) 的字面替代方案是 np.asarray(arg, dtype=dtype)

  • np.source 已被移除。首選替代方案是 inspect.getsource

  • np.lookfor 已被移除。

    (gh-24144)

  • numpy.who 已被移除。作為已移除功能的替代方案,可以使用 IDE(例如 Spyder 或 Jupyter Notebook)中提供的變數瀏覽器。

    (gh-24321)

  • numpy.exceptions 中存在的警告和例外(例如,ComplexWarningVisibleDeprecationWarning)不再在主命名空間中公開。

  • 已從主命名空間中移除多個小眾列舉、過期的成員和函數,例如:ERR_*SHIFT_*np.fastCopyAndTransposenp.kernel_versionnp.numarraynp.oldnumericnp.set_numeric_ops

    (gh-24316)

  • numpy/__init__.py 中,以顯式匯入取代了 from ... import *。因此,這些主命名空間成員被移除:np.FLOATING_POINT_SUPPORTnp.FPE_*np.NINFnp.PINFnp.NZEROnp.PZEROnp.CLIPnp.WRAPnp.WRAPnp.RAISEnp.BUFSIZEnp.UFUNC_BUFSIZE_DEFAULTnp.UFUNC_PYVALS_NAMEnp.ALLOW_THREADSnp.MAXDIMSnp.MAY_SHARE_EXACTnp.MAY_SHARE_BOUNDSadd_newdocnp.add_docstringnp.add_newdoc_ufunc

    (gh-24357)

  • 別名 np.float_ 已被移除。請改用 np.float64

  • 別名 np.complex_ 已被移除。請改用 np.complex128

  • 別名 np.longfloat 已被移除。請改用 np.longdouble

  • 別名 np.singlecomplex 已被移除。請改用 np.complex64

  • 別名 np.cfloat 已被移除。請改用 np.complex128

  • 別名 np.longcomplex 已被移除。請改用 np.clongdouble

  • 別名 np.clongfloat 已被移除。請改用 np.clongdouble

  • 別名 np.string_ 已被移除。請改用 np.bytes_

  • 別名 np.unicode_ 已被移除。請改用 np.str_

  • 別名 np.Inf 已被移除。請改用 np.inf

  • 別名 np.Infinity 已被移除。請改用 np.inf

  • 別名 np.NaN 已被移除。請改用 np.nan

  • 別名 np.infty 已被移除。請改用 np.inf

  • 別名 np.mat 已被移除。請改用 np.asmatrix

  • np.issubclass_ 已被移除。請改用內建的 issubclass

  • np.asfarray 已被移除。請改用具有正確 dtype 的 np.asarray

  • np.set_string_function 已被移除。請改用 np.set_printoptions,並為 NumPy 物件的自訂列印設定格式器。

  • np.tracemalloc_domain 現在僅可從 np.lib 取得。

  • np.recfromcsvnp.recfromtxt 已從主命名空間中移除。請改用具有逗號分隔符的 np.genfromtxt

  • np.issctypenp.maximum_sctypenp.obj2sctypenp.sctype2charnp.sctypesnp.issubsctype 都已從主命名空間中移除,且沒有替代方案,因為它們是小眾成員。

  • 已棄用的 np.deprecatenp.deprecate_with_doc 已從主命名空間中移除。請改用 DeprecationWarning

  • 已棄用的 np.safe_eval 已從主命名空間中移除。請改用 ast.literal_eval

    (gh-24376)

  • np.find_common_type 已被移除。請改用 numpy.promote_typesnumpy.result_type。若要實現 scalar_types 引數的語意,請使用 numpy.result_type 並傳遞 00.00j 作為 Python 純量。

  • np.round_ 已被移除。請改用 np.round

  • np.nbytes 已被移除。請改用 np.dtype(<dtype>).itemsize

    (gh-24477)

  • np.compare_chararrays 已從主命名空間中移除。請改用 np.char.compare_chararrays

  • 主命名空間中的 charrarray 已被棄用。目前可以從 np.char.chararray 匯入,而不會出現棄用警告,但我們計劃在未來完全棄用和移除 chararray

  • np.format_parser 已從主命名空間中移除。請改用 np.rec.format_parser

    (gh-24587)

  • 已從 np.dtype 中移除對七個資料型別字串別名的支援:int0uint0void0object0str0bytes0bool8

    (gh-24807)

  • 實驗性的 numpy.array_api 子模組已被移除。請改用主要 numpy 命名空間進行常規使用,或使用單獨的 array-api-strict 套件,以用於 numpy.array_api 主要用於的符合性測試用例。

    (gh-25911)

__array_prepare__ 已移除#

UFuncs 在執行一般 ufunc 呼叫(非廣義 ufunc、縮減等)的計算之前呼叫 __array_prepare__。該函數也會在某些線性代數函數的結果上,而不是呼叫 __array_wrap__

現在已移除。如果您使用它,請遷移到 __array_ufunc__ 或依賴 __array_wrap__,後者在所有情況下都會使用上下文呼叫,儘管僅在結果陣列填滿之後。在這些程式碼路徑中,__array_wrap__ 現在將傳遞基底類別,而不是子類別陣列。

(gh-25105)

棄用#

  • np.compat 已被棄用,因為不再支援 Python 2。

  • numpy.int8 和類似的類別將不再支援將超出範圍的 python 整數轉換為整數陣列。例如,將 255 轉換為 int8 不會傳回 -1。numpy.iinfo(dtype) 可用於檢查資料型別的機器限制。例如,np.iinfo(np.uint16) 傳回 min = 0 和 max = 65535。

    np.array(value).astype(dtype) 將提供所需的結果。

  • np.safe_eval 已被棄用。應改用 ast.literal_eval

    (gh-23830)

  • np.recfromcsvnp.recfromtxtnp.dispnp.get_array_wrapnp.maximum_sctypenp.deprecatenp.deprecate_with_doc 已被棄用。

    (gh-24154)

  • np.trapz 已被棄用。請改用 np.trapezoidscipy.integrate 函數。

  • np.in1d 已被棄用。請改用 np.isin

  • 別名 np.row_stack 已被棄用。請直接使用 np.vstack

    (gh-24445)

  • __array_wrap__ 現在傳遞 arr、context、return_scalar,並且不接受所有三個參數的實作支援已被棄用。其簽名應為 __array_wrap__(self, arr, context=None, return_scalar=False)

    (gh-25409)

  • 用於 np.cross 的 2 維向量陣列已被棄用。請改用 3 維向量陣列。

    (gh-24818)

  • np.dtype("a") 別名 np.dtype(np.bytes_) 已被棄用。請改用 np.dtype("S") 別名。

    (gh-24854)

  • 搭配函數 assert_array_equalassert_array_almost_equal 使用關鍵字引數 xy 已被棄用。請改為以位置引數傳遞前兩個引數。

    (gh-24978)

numpy.fft 對於在引數中使用 None 值的 n 維轉換的棄用#

根據陣列 API 標準,使用 fftnifftnrfftnirfftnfft2ifft2rfft2irfft2,且 s 參數設定為非 None 的值,而 axes 參數設定為 None 已被棄用。若要保留目前的行為,請為維度為 k 的陣列將序列 [0, …, k-1] 傳遞給 axes

此外,將包含 None 值的陣列傳遞給 s 已被棄用,因為該參數在 NumPy 文件和陣列 API 規範中都記錄為接受整數序列。若要使用對應的 1 維轉換的預設行為,請傳遞與其 n 參數的預設值相符的值。若要使用每個軸的預設行為,可以省略 s 引數。

(gh-25495)

np.linalg.lstsq 現在預設為新的 rcond#

lstsq 現在使用新的 rcond 值,即機器精度乘以 max(M, N)。先前,使用機器精度,但發出了 FutureWarning 以通知最終會發生此變更。仍然可以透過傳遞 rcond=-1 來實現舊的行為。

(gh-25721)

過期的棄用#

  • np.core.umath_tests 子模組已從公共 API 中移除。(在 NumPy 1.15 中已棄用)

    (gh-23809)

  • PyDataMem_SetEventHook 棄用已過期且已移除。請使用 tracemallocnp.lib.tracemalloc_domain 域。(在 NumPy 1.23 中已棄用)

    (gh-23921)

  • set_numeric_ops 和 C 函數 PyArray_SetNumericOpsPyArray_GetNumericOps 的棄用已過期,並且這些函數已移除。(在 NumPy 1.16 中已棄用)

    (gh-23998)

  • fasttakefastclipfastputmask ArrFuncs 棄用現在已最終確定。

  • 已棄用的函數 fastCopyAndTranspose 及其 C 對應項現在已移除。

  • PyArray_ScalarFromObject 的棄用現在已最終確定。

    (gh-24312)

  • np.msort 已被移除。作為替代方案,應改用 np.sort(a, axis=0)

    (gh-24494)

  • np.dtype(("f8", 1) 現在將傳回形狀為 1 的子陣列 dtype,而不是非子陣列 dtype。

    (gh-25761)

  • 不允許為 ndarray 的 .data 屬性賦值,並且會引發錯誤。

  • 如果寬度太小,np.binary_repr(a, width) 將會引發錯誤。

  • PyArray_DescrFromType() 中使用 NPY_CHAR 將會引發錯誤,請改用 NPY_STRING NPY_UNICODENPY_VSTRING

    (gh-25794)

相容性注意事項#

loadtxtgenfromtxt 預設編碼已變更#

loadtxtgenfromtxt 現在都預設為 encoding=None,這可能會主要修改 converters 的工作方式。這些現在將傳遞 str 而不是 bytes。請明確傳遞編碼以始終獲得新的或舊的行為。對於 genfromtxt,此變更也表示傳回的值現在將是 unicode 字串而不是 bytes。

(gh-25158)

f2py 相容性注意事項#

  • f2py 將不再接受含糊不清的 -m.pyf 命令列介面 (CLI) 組合。當傳遞多個 .pyf 檔案時,將會引發錯誤。當同時傳遞 -m.pyf 時,會發出警告,並且 -m 提供的名稱將被忽略。

    (gh-25181)

  • 已移除 f2py.compile() 輔助函式,因為它會洩漏記憶體,並且多年來一直被標記為實驗性功能,而且是以精簡的 subprocess.run 包裝器實作。它也是測試瓶頸之一。請參閱 gh-25122 以瞭解完整理由。它也使用了幾個 np.distutils 功能,這些功能過於脆弱,無法移植以與 meson 搭配使用。

  • 強烈建議使用者將對 f2py.compile 的呼叫替換為對 subprocess.run("python", "-m", "numpy.f2py",... 的呼叫,並使用環境變數與 meson 互動。原生檔案也是一種選擇。

    (gh-25193)

排序函式行為的微小變更#

由於演算法變更和 SIMD 程式碼的使用,與 1.26.x 相比,使用不穩定方法的排序函式在 2.0.0 中可能會傳回略有不同的結果。這包括 argsortargpartition 的預設方法。

移除 np.solve 中廣播時的歧義#

b 的維度比 a 少 1 時,np.solve(a, b) 的廣播規則是模糊不清的。這已以向後不相容的方式解決,並且現在符合 Array API。舊的行為可以使用 np.solve(a, b[..., None])[..., 0] 來重建。

(gh-25914)

修改了 Polynomial 的表示方式#

更新了 Polynomial 的表示方法,以在表示中包含定義域。純文字和 LaTeX 表示現在一致。例如,str(np.polynomial.Polynomial([1, 1], domain=[.1, .2])) 的輸出過去是 1.0 + 1.0 x,但現在是 1.0 + 1.0 (-3.0000000000000004 + 20.0 x)

(gh-21760)

C 語言 API 變更#

  • 已移除 PyArray_CGTPyArray_CLTPyArray_CGEPyArray_CLEPyArray_CEQPyArray_CNE 巨集。

  • PyArray_MINPyArray_MAX 已從 ndarraytypes.h 移動到 npy_math.h

    (gh-24258)

  • 已公開用於處理 numpy.dtypes.StringDType 陣列的 C 語言 API。這包括用於取得和釋放鎖定字串資料存取的互斥鎖,以及從陣列條目封裝和解封裝 UTF-8 位元組串流的函式。

  • NPY_NTYPES 已重新命名為 NPY_NTYPES_LEGACY,因為它不包含新的 NumPy 內建 DType。特別是新的字串 DType 可能無法與處理舊版 DType 的程式碼正確運作。

    (gh-25347)

  • C-API 現在僅匯出陣列存取器的靜態內聯函式版本(先前這取決於是否使用「已棄用的 API」)。雖然我們不鼓勵這樣做,但結構欄位仍然可以直接使用。

    (gh-25789)

  • NumPy 現在定義了 PyArray_Pack 以設定個別記憶體位址。與 PyArray_SETITEM 不同,此函式相當於設定個別陣列項目,並且不需要 NumPy 陣列輸入。

    (gh-25954)

  • 已從 PyArray_Descr 中移除 ->f 插槽。如果您使用此插槽,請將存取它替換為 PyDataType_GetArrFuncs(請參閱其文件和 NumPy 2.0 遷移指南)。在某些情況下,使用其他函式(例如 PyArray_GETITEM)可能是替代方案。

  • PyArray_GETITEMPyArray_SETITEM 現在需要匯入 NumPy API 表才能使用,並且不再於 ndarraytypes.h 中定義。

    (gh-25812)

  • 由於執行階段相依性,存取 dtype 旗標的功能定義已從 numpy/ndarraytypes.h 移動,並且僅在包含 numpy/ndarrayobject.h 後才可用,因為它需要 import_array()。這包括 PyDataType_FLAGCHKPyDataType_REFCHKNPY_BEGIN_THREADS_DESCR

  • PyArray_Descr 上的 dtype 旗標現在必須透過 PyDataType_FLAGS 內聯函式存取,才能與 1.x 和 2.x 相容。此函式在 npy_2_compat.h 中定義,以允許向後移植。大多數或所有使用者都應該使用 PyDataType_FLAGCHK,它在 1.x 上可用,並且不需要向後移植。Cython 使用者應該使用 Cython 3。否則,除非他們改用 PyDataType_FLAGCHK,否則存取將透過 Python 進行。

    (gh-25816)

C API 和 Cython 綁定中公開的 Datetime 功能#

已將函式 NpyDatetime_ConvertDatetime64ToDatetimeStructNpyDatetime_ConvertDatetimeStructToDatetime64NpyDatetime_ConvertPyDateTimeToDatetimeStructNpyDatetime_GetDatetimeISO8601StrLenNpyDatetime_MakeISO8601DatetimeNpyDatetime_ParseISO8601Datetime 新增至 C API,以方便在外部函式庫中於字串、Python datetime 和 NumPy datetime 之間進行轉換。

(gh-21199)

廣義 ufunc C API 的 const 正確性#

NumPy C API 用於建構廣義 ufunc 的函式 (PyUFunc_FromFuncAndDataPyUFunc_FromFuncAndDataAndSignaturePyUFunc_FromFuncAndDataAndSignatureAndIdentity) 接受 NumPy 內部程式碼未修改的 typesdata 引數。與 namedoc 引數一樣,第三方 Python 擴充模組可能會從靜態常數提供這些引數。typesdata 引數現在是 const 正確的:它們分別宣告為 const char *typesvoid *const *data。C 程式碼應該不受影響,但 C++ 程式碼可能會受到影響。

(gh-23847)

更大的 NPY_MAXDIMSNPY_MAXARGS,引入了 NPY_RAVEL_AXIS#

NPY_MAXDIMS 現在是 64,您可能需要檢閱其使用情況。這通常用於堆疊配置,增加應該是安全的。但是,我們通常鼓勵移除任何 NPY_MAXDIMSNPY_MAXARGS 的使用,以便最終完全移除限制。對於轉換輔助函式和鏡像 Python 函式(例如 take)的 C-API 函式,NPY_MAXDIMS 用於表示 axis=None。此類用法必須替換為 NPY_RAVEL_AXIS。另請參閱 增加的最大維度數

(gh-25149)

NPY_MAXARGS 不是常數且 PyArrayMultiIterObject 大小變更#

由於 NPY_MAXARGS 已增加,因此它現在是執行階段常數,而不是編譯時期常數。我們預期幾乎沒有使用者會注意到這一點。但是,如果用於堆疊配置,則現在必須替換為使用 NPY_MAXARGS 作為額外執行階段檢查的自訂常數。

sizeof(PyArrayMultiIterObject) 不再包含物件的完整大小。我們預期沒有人會注意到此變更。這是為了避免 Cython 的問題所必需的。

(gh-25271)

自訂舊版使用者 dtype 的必要變更#

為了改進我們的 DType,不幸的是必須中斷 ABI,這需要對使用 PyArray_RegisterDataType 註冊的 dtype 進行一些變更。請參閱 PyArray_RegisterDataType 的文件,以瞭解如何調整您的程式碼並實現與 1.x 和 2.x 的相容性。

(gh-25792)

新的公開 DType API#

NEP 42 DType API 的 C 語言實作現在是公開的。雖然 DType API 已在 NumPy 中發布了幾個版本,但它僅適用於設定了特殊環境變數的工作階段。現在可以使用新的 DType API 和用於匯入 numpy C API 的正常 import_array() 機制,在 NumPy 外部編寫自訂 DType。

請參閱 自訂資料類型 以瞭解有關 API 的更多詳細資訊。與新功能一樣,請回報您在實作或使用新 DType 時遇到的任何錯誤。處理 dtype 的下游 C 程式碼可能需要更新,才能與新的 DType 正確運作。

(gh-25754)

新的 C-API 匯入函式#

我們現在新增了 PyArray_ImportNumPyAPIPyUFunc_ImportUFuncAPI 作為靜態內聯函式,以匯入 NumPy C-API 表。新函式比 import_arrayimport_ufunc 具有兩個優點

  • 它們檢查是否已執行匯入,如果沒有,則它們是輕量級的,允許謹慎地新增它們(雖然在大多數情況下這不是首選)。

  • 舊機制是巨集而不是函式,其中包含 return 陳述式。

PyArray_ImportNumPyAPI() 函式包含在 npy_2_compat.h 中,以便更輕鬆地向後移植。

(gh-25866)

透過函式存取結構化 dtype 資訊#

dtype 結構欄位 c_metadatanamesfieldssubarray 現在必須透過遵循相同名稱的新函式存取,例如 PyDataType_NAMES。欄位的直接存取無效,因為它們並非適用於所有 PyArray_Descr 實例。metadata 欄位已保留,但也應優先使用巨集版本。

(gh-25802)

描述器 elsizealignment 存取#

除非僅使用 NumPy 2 支援進行編譯,否則現在必須透過 PyDataType_ELSIZEPyDataType_SET_ELSIZEPyDataType_ALIGNMENT 存取 elsizealignment 欄位。在描述器附加到陣列的情況下,我們建議使用 PyArray_ITEMSIZE,因為它存在於所有 NumPy 版本中。請參閱 PyArray_Descr 結構已變更 以瞭解更多資訊。

(gh-25943)

NumPy 2.0 C API 移除#

  • 已移除 npy_interrupt.h 和對應的巨集(例如 NPY_SIGINT_ON)。我們建議定期查詢 PyErr_CheckSignals()PyOS_InterruptOccurred()(這些目前確實需要持有 GIL)。

  • 已移除 noprefix.h 標頭。將遺失的符號替換為其具有前綴的對應項(通常是新增的 NPY_npy_)。

    (gh-23919)

  • 已移除 PyUFunc_GetPyValsPyUFunc_handlefperrPyUFunc_checkfperr。如果需要,可以還原新的向後相容函式以引發浮點錯誤。移除原因:沒有已知的使用者,並且這些函式會使 with np.errstate() 修復變得更加困難)。

    (gh-23922)

  • 已移除自 NumPy 1.7 以來已棄用的 API 的一部分 numpy/old_defines.h。這會移除 PyArray_CONSTANT 形式的巨集。replace_old_macros.sed 指令碼可用於將它們轉換為 NPY_CONSTANT 版本。

    (gh-24011)

  • 已移除 ufunc 結構的 legacy_inner_loop_selector 成員,以簡化對分派系統的改進。沒有已知的使用者覆寫或直接存取此成員。

    (gh-24271)

  • 已移除 NPY_INTPLTR 以避免混淆(請參閱 intp 重新定義)。

    (gh-24888)

  • 已移除進階索引 MapIter 和相關 API。它的(真正)公開部分未經過充分測試,並且只有一個已知的使用者 (Theano)。將其設為私有將簡化加速 ufunc.at 的改進,使進階索引更易於維護,並且對於將陣列的最大維度數增加到 64 非常重要。如果此 API 對您很重要,請告訴我們,以便我們可以一起找到解決方案。

    (gh-25138)

  • 已移除 NPY_MAX_ELSIZE 巨集,因為它僅反映內建數字類型,並且沒有內部用途。

    (gh-25149)

  • 已移除 PyArray_REFCNTNPY_REFCOUNT。請改用 Py_REFCNT

    (gh-25156)

  • PyArrayFlags_TypePyArray_NewFlagsObject 以及 PyArrayFlagsObject 現在是私有的。沒有已知的用例;如果需要,請使用 Python API。

  • 已移除 PyArray_MoveIntoPyArray_CastToPyArray_CastAnyTo,請使用 PyArray_CopyInto,如果絕對需要,請使用 PyArray_CopyAnyInto(後者執行平面複製)。

  • 已移除 PyArray_FillObjectArray,其唯一真正的用途是實作 np.empty。建立新的空陣列或使用 PyArray_FillWithScalar()(遞減現有物件的參考計數)。

  • 已移除 PyArray_CompareUCS4PyArray_CompareString。請使用標準 C 字串比較函式。

  • 已移除 PyArray_ISPYTHON,因為它具有誤導性,沒有已知的用例,並且很容易替換。

  • 已移除 PyArray_FieldNames,因為不清楚它有什麼用。在某些可能的用例中,它也具有不正確的語義。

  • 已移除 PyArray_TypestrConvert,因為它似乎用詞不當,並且不太可能被任何人使用。如果您知道大小或僅限於少數類型,請直接明確使用它,否則請透過 Python 字串。

    (gh-25292)

  • 已移除 PyDataType_GetDatetimeMetaData,自 NumPy 1.7 以來它實際上沒有執行任何操作。

    (gh-25802)

  • 已移除 PyArray_GetCastFunc。請注意,自訂舊版使用者 dtype 仍然可以將 castfunc 作為其實作提供,但現在已移除對它們的任何存取。原因是 NumPy 多年來從未在內部使用過它們。如果您使用簡單的數字類型,請直接使用 C 語言轉換。如果您需要替代方案,請告訴我們,以便我們可以建立新的 API,例如 PyArray_CastBuffer(),它可以根據 NumPy 版本使用舊的或新的轉換函式。

    (gh-25161)

新功能#

擴展了 np.add 以與 unicodebytes dtype 搭配使用。#

新的 bitwise_count 函式#

這個新函式計算數字中 1 位元的數量。bitwise_count 適用於所有 numpy 整數類型和類似整數的物件。

>>> a = np.array([2**i - 1 for i in range(16)])
>>> np.bitwise_count(a)
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15],
      dtype=uint8)

(gh-19355)

macOS Accelerate 支援,包括 ILP64#

新增了對更新的 Accelerate BLAS/LAPACK 函式庫的支援,包括 macOS 13.3 中的 ILP64 (64 位元整數) 支援。這帶來了 arm64 支援,以及常用線性代數運算高達 10 倍的顯著效能提升。如果在建置時選取 Accelerate,或者如果未完成明確的 BLAS 函式庫選取,則如果可用,將自動使用 13.3+ 版本。

(gh-24053)

二進位 wheel 也可用。在 macOS >=14.0 上,從 PyPI 安裝 NumPy 的使用者將獲得針對 Accelerate 而不是 OpenBLAS 建置的 wheel。

(gh-25255)

用於分位數和百分位數函式的權重選項#

現在 quantilepercentilenanquantilenanpercentile 提供 weights 關鍵字。只有 method="inverted_cdf" 支援權重。

(gh-24254)

改進的 CPU 優化追蹤#

提供了一種新的追蹤器機制,可以追蹤 NumPy 函式庫中每個優化函式(即使用硬體特定的 SIMD 指令的函式)的已啟用目標。透過此增強功能,可以精確監控已分派函式的已啟用 CPU 分派目標。

已將名為 opt_func_info 的新函式新增至新的命名空間 numpy.lib.introspect,提供此追蹤功能。此函式可讓您根據函式名稱和資料類型簽章擷取有關已啟用目標的資訊。

(gh-24420)

f2py 的新 Meson 後端#

編譯模式下的 f2py (即 f2py -c) 現在接受 --backend meson 選項。這是 Python >=3.12 的預設選項。對於較舊的 Python 版本,f2py 仍將預設為 --backend distutils

為了在實際用例中支援此功能,在編譯模式下,f2py 接受一個或多個 --dep 旗標,這些旗標對應於 meson 後端中的 dependency() 呼叫,並且在 distutils 後端中不執行任何操作。

對於僅將 f2py 用作程式碼產生器(即沒有 -c)的使用者,沒有任何變更。

(gh-24532)

f2pybind(c) 支援#

函式和副程式都可以使用 bind(c) 註釋。f2py 將處理正確的類型對應,並為其他 C 介面保留唯一標籤。

注意: 根據設計,f2py 綁定不支援 bind(c, name = 'routine_name_other_than_fortran_routine'),因為帶有 namebind(c) 旨在僅保證 C 和 Fortran 中的名稱相同,而不是 Python 和 Fortran 中的名稱相同。

(gh-24555)

幾個測試函式的新 strict 選項#

現在 assert_allcloseassert_equalassert_array_less 提供 strict 關鍵字。設定 strict=True 將停用純量廣播行為,並確保輸入陣列具有相同的資料類型。

(gh-24680, gh-24770, gh-24775)

新增 np.core.umath.findnp.core.umath.rfind UFuncs#

新增兩個 findrfind UFuncs,它們可作用於 Unicode 或位元組字串,並用於 np.char 中。它們的操作方式與 str.findstr.rfind 類似。

(gh-24868)

diagonaltrace 用於 numpy.linalg#

已新增 numpy.linalg.diagonalnumpy.linalg.trace,它們是與陣列 API 標準相容的 numpy.diagonalnumpy.trace 的變體。它們在定義二維子陣列的預設軸選擇上有所不同。

(gh-24887)

新增 longulong dtypes#

已新增 numpy.longnumpy.ulong 作為 NumPy 整數,對應到 C 語言的 longunsigned long。在 NumPy 1.24 之前,numpy.long 是 Python int 的別名。

(gh-24922)

svdvals 用於 numpy.linalg#

已新增 numpy.linalg.svdvals。它計算(堆疊)矩陣的奇異值。執行 np.svdvals(x) 等同於呼叫 np.svd(x, compute_uv=False, hermitian=False)。此函數與陣列 API 標準相容。

(gh-24940)

新增 isdtype 函數#

已新增 numpy.isdtype,以提供一種符合陣列 API 標準的規範方式來分類 NumPy 的 dtypes。

(gh-25054)

新增 astype 函數#

已新增 numpy.astype,以提供與陣列 API 標準相容的替代方案,取代 numpy.ndarray.astype 方法。

(gh-25079)

與陣列 API 相容的函數別名#

新增了 13 個現有函數的別名,以提高與陣列 API 標準的相容性

  • 三角函數:acosacoshasinasinhatanatanhatan2

  • 位元運算:bitwise_left_shiftbitwise_invertbitwise_right_shift

  • 其他:concatpermute_dimspow

  • numpy.linalg 中:tensordotmatmul

(gh-25086)

新增 unique_* 函數#

已新增 unique_allunique_countsunique_inverseunique_values 函數。它們提供具有不同旗標集的 unique 功能。它們與陣列 API 標準相容,而且由於它們傳回的陣列數量不取決於輸入引數的值,因此它們更容易成為 JIT 編譯的目標。

(gh-25088)

ndarrays 的矩陣轉置支援#

NumPy 現在提供計算陣列(或陣列堆疊)矩陣轉置的支援。矩陣轉置相當於交換陣列的最後兩個軸。np.ndarraynp.ma.MaskedArray 現在都公開了 .mT 屬性,並且有一個匹配的新 numpy.matrix_transpose 函數。

(gh-23762)

用於 numpy.linalg 的陣列 API 相容函數#

新增了六個新函數和兩個別名,以提高與 numpy.linalg 的陣列 API 標準的相容性

用於 varstdcorrection 引數#

已將 correction 引數新增至 varstd,它是與陣列 API 標準相容的 ddof 替代方案。由於這兩個引數的目的相似,因此一次只能提供其中一個。

(gh-25169)

ndarray.devicendarray.to_device#

為了與陣列 API 標準相容,已將 ndarray.device 屬性和 ndarray.to_device 方法新增至 numpy.ndarray

此外,還為以下項目新增了僅限關鍵字 device 的引數:asarrayarangeemptyempty_likeeyefullfull_likelinspaceonesones_likezeroszeros_like

對於所有這些新引數,僅支援 device="cpu"

(gh-25233)

StringDType 已新增至 NumPy#

我們新增了一種新的可變寬度 UTF-8 編碼字串資料類型,實作「Python 字串的 NumPy 陣列」,包括支援使用者提供的遺失資料 sentinel。它旨在作為使用物件 dtype 的 Python 字串陣列和遺失資料 sentinel 的直接替代品。請參閱 NEP 55文件 以取得更多詳細資訊。

(gh-25347)

用於 choleskypinv 的新關鍵字#

分別將 upperrtol 關鍵字新增至 numpy.linalg.choleskynumpy.linalg.pinv,以提高陣列 API 標準的相容性。

對於 pinv,如果未指定 rcondrtol,則會使用 rcond 的預設值。我們計劃在未來棄用並移除 rcond

(gh-25388)

用於 sortargsortlinalg.matrix_rank 的新關鍵字#

新增了關鍵字參數,以提高陣列 API 標準的相容性

(gh-25437)

用於字串 ufuncs 的新 numpy.strings 命名空間#

NumPy 現在將一些字串操作實作為 ufuncs。舊的 np.char 命名空間仍然可用,並且在可能的情況下,該命名空間中的字串操作函數已更新為使用新的 ufuncs,從而大幅提高了其效能。

在可能的情況下,我們建議更新程式碼以使用 np.strings 中的函數,而不是 np.char。未來,我們可能會棄用 np.char,轉而使用 np.strings

(gh-25463)

numpy.fft 支援不同的精度和就地計算#

numpy.fft 中的各種 FFT 常式現在以 float、double 或 long double 精度原生執行計算,具體取決於輸入精度,而不是始終以 double 精度計算。因此,現在對於 single 精度,計算將不太精確,而對於 long double 精度,計算將更精確。輸出陣列的資料類型現在將相應地調整。

此外,所有 FFT 常式都獲得了一個 out 引數,可用於就地計算。

(gh-25536)

configtool 和 pkg-config 支援#

一個新的 numpy-config CLI 腳本可用,可以查詢 NumPy 版本和使用 NumPy C API 所需的編譯旗標。這將使建置系統能夠更好地支援將 NumPy 用作依賴項。此外,Numpy 現在包含一個 numpy.pc pkg-config 檔案。為了找到它與 PKG_CONFIG_PATH 一起使用的位置,請使用 numpy-config --pkgconfigdir

(gh-25730)

主要命名空間中對陣列 API 標準的支援#

主要的 numpy 命名空間現在支援陣列 API 標準。有關詳細資訊,請參閱 陣列 API 標準相容性

(gh-25911)

改善#

anyall 和邏輯 ufuncs 現在支援字串。#

整數序列作為 memmap 的 shape 引數#

現在可以使用任何整數序列作為 shape 引數來建立 numpy.memmap,例如整數列表或 numpy 陣列。先前,只有 tuple 和 int 類型可以在不引發錯誤的情況下使用。

(gh-23729)

errstate 現在更快且上下文安全#

numpy.errstate 上下文管理器/裝飾器現在更快且更安全。先前,它不是上下文安全的,並且在執行緒安全方面存在(罕見的)問題。

(gh-23936)

透過使用 Highway 的 VQSort 提高了 AArch64 quicksort 速度#

首次引入 Google Highway 函式庫,在 AArch64 上使用 VQSort。在某些情況下,執行時間最多提高了 16 倍,請參閱 PR 以取得基準測試結果。未來將擴展到其他平台。

(gh-24018)

複數類型 - 底層 C 類型變更#

  • NumPy 所有複數類型的底層 C 類型已變更為使用 C99 複數類型。

  • 雖然此變更不會影響複數類型的記憶體佈局,但它變更了用於直接擷取或寫入複數的實部或虛部的 API,因為直接欄位存取(如 c.realc.imag 中)不再是一種選項。您現在可以使用 numpy/npy_math.h 中提供的公用程式來執行這些操作,如下所示

    npy_cdouble c;
    npy_csetreal(&c, 1.0);
    npy_csetimag(&c, 0.0);
    printf("%d + %di\n", npy_creal(c), npy_cimag(c));
    
  • 為了簡化跨版本相容性,已新增等效的巨集和相容性層,下游套件可以使用它們繼續支援 NumPy 1.x 和 2.x。有關更多資訊,請參閱 複數支援

  • numpy/npy_common.h 現在包含 complex.h,這表示 complex 現在是一個保留關鍵字。

(gh-24085)

iso_c_binding 支援和改進的 f2py 通用區塊#

先前,使用者必須定義自己的自訂 f2cmap 檔案,才能使用 Fortran2003 iso_c_binding 內建模組定義的類型對應。這些類型對應現在由 f2py 原生支援

(gh-24555)

f2py 現在處理具有來自模組的 kind 規格的 common 區塊。這進一步擴展了 iso_fortran_enviso_c_binding 等內建函數的可用性。

(gh-25186)

在類似 assert_equal 的函數的第三個引數上自動呼叫 str#

函數(如 assert_equal)的第三個引數現在會自動呼叫 str。這樣,它會模仿內建的 assert 陳述式,其中 assert_equal(a, b, obj) 的作用類似於 assert a == b, obj

(gh-24877)

iscloseallclose 中支援類似陣列的 atol/rtol#

iscloseallclose 中的關鍵字 atolrtol 現在接受純量和陣列。如果給定陣列,則它必須廣播到前兩個陣列引數的形狀。

(gh-24878)

測試函數中一致的失敗訊息#

先前,某些 numpy.testing 斷言列印的訊息將實際結果和預期結果稱為 xy。現在,這些值始終稱為 ACTUALDESIRED

(gh-24931)

n 維 FFT 轉換允許 s[i] == -1#

如果 s[i] == -1,則 fftnifftnrfftnirfftnfft2ifft2rfft2irfft2 函數現在沿著軸 i 使用整個輸入陣列,這符合陣列 API 標準。

(gh-25495)

為有限 API 保護 PyArrayScalar_VAL 和 PyUnicodeScalarObject#

PyUnicodeScalarObject 保留了 PyUnicodeObject,當使用 Py_LIMITED_API 時,它不可用。新增保護以隱藏它,並因此也隱藏 PyArrayScalar_VAL 巨集。

(gh-25531)

變更#

  • np.gradient() 現在傳回一個元組而不是列表,使傳回值不可變。

    (gh-23861)

  • 由於完全是上下文和執行緒安全的,因此現在只能輸入一次 np.errstate

  • np.setbufsize 現在與 np.errstate() 相關聯:離開 np.errstate 上下文也會重設 bufsize

    (gh-23936)

  • 新增了一個公開的 np.lib.array_utils 子模組,目前包含三個函數:byte_bounds (從 np.lib.utils 移動而來)、normalize_axis_tuplenormalize_axis_index

    (gh-24540)

  • 引入 numpy.bool 作為 NumPy 布林 dtype 的新標準名稱,並將 numpy.bool_ 作為其別名。請注意,在 NumPy 1.24 之前,np.bool 是 Python 內建 bool 的別名。新名稱有助於陣列 API 標準的相容性,並且是更直觀的名稱。

    (gh-25080)

  • dtype.flags 值先前儲存為帶符號整數。這表示 aligned dtype 結構旗標會導致設定負數旗標(-128 而非 128)。此旗標現在以無符號(正數)方式儲存。手動檢查旗標的程式碼可能需要調整。這可能包含使用 Cython 0.29.x 編譯的程式碼。

    (gh-25816)

NumPy 純量表示法的變更#

根據 NEP 51,純量表示法已更新以包含類型資訊,以避免與 Python 純量混淆。

純量現在會印成 np.float64(3.0) 而非僅僅 3.0。這可能會擾亂儲存數字表示法(例如,儲存到檔案)的工作流程,使其更難以閱讀。它們應儲存為明確的字串,例如使用 str()f"{scalar!s}"。目前,受影響的使用者可以使用 np.set_printoptions(legacy="1.25") 來取得舊的行為(可能有一些例外)。下游專案的文件可能需要較大的更新,如果程式碼片段有經過測試。我們正在開發 doctest-plus 的工具,以方便更新。

(gh-22449)

NumPy 字串的真值性已變更#

NumPy 字串先前在如何定義字串為 TrueFalse 方面不一致,且定義與 Python 使用的定義不符。字串現在在非空時被視為 True,在為空時被視為 False。這變更了以下不同的情況

  • 從字串到布林的轉換先前大致等同於 string_array.astype(np.int64).astype(bool),表示只有有效的整數才能轉換。現在,"0" 字串將被視為 True,因為它不是空的。如果您需要舊的行為,您可以使用上述步驟(先轉換為整數)或 string_array == "0"(如果輸入僅為 01)。要在舊版 NumPy 上取得新結果,請使用 string_array != ""

  • np.nonzero(string_array) 先前忽略了空白字元,因此僅包含空白字元的字串被視為 False。空白字元現在被視為 True

此變更不影響 np.loadtxtnp.fromstringnp.genfromtxt。前兩者仍然使用整數定義,而 genfromtxt 繼續比對 "true"(忽略大小寫)。但是,如果將 np.bool_ 用作轉換器,則結果將會變更。

此變更確實影響 np.fromregex,因為它使用直接賦值。

(gh-23871)

為 var 和 std 函數新增了 mean 關鍵字#

通常在需要標準差時,也需要平均值。變異數和平均值的情況也是如此。到目前為止,平均值會被計算兩次,此處針對 varstd 函數引入的變更允許傳入預先計算的平均值作為關鍵字引數。請參閱文件字串以取得詳細資訊,以及說明速度提升的範例。

(gh-24126)

移除建構時使用時區的 datetime64 棄用警告#

numpy.datetime64 方法現在在提供的 datetime 字串中包含時區時,會發出 UserWarning 而非 DeprecationWarning。

(gh-24193)

在 64 位元 Windows 上,預設整數 dtype 現在為 64 位元#

在所有 64 位元系統上,預設 NumPy 整數現在為 64 位元,因為 Windows 上歷史悠久的 32 位元預設值是常見問題的來源。大多數使用者應該不會注意到這一點。主要問題可能發生在與以 C 等編譯語言編寫的函式庫介接的程式碼中。如需更多資訊,請參閱 Windows 預設整數

(gh-24224)

numpy.core 重新命名為 numpy._core#

存取 numpy.core 現在會發出 DeprecationWarning。實際上,我們發現大多數下游 numpy.core 的使用是為了存取在主要 numpy 命名空間中可用的功能。如果您因為某些原因正在使用 numpy.core 中在主要 numpy 命名空間中不可用的功能,這表示您可能正在使用私有的 NumPy 內部元件。您仍然可以透過 numpy._core 存取這些內部元件,而不會出現棄用警告,但我們不為 NumPy 內部元件提供任何回溯相容性保證。如果您認為犯了錯誤,並且需要公開某些內容,請開啟一個 issue。

(gh-24634)

先前透過 NPY_RELAXED_STRIDES_DEBUG 環境變數或 -Drelaxed-strides-debug config-settings 旗標啟用的「relaxed strides」偵錯建置選項已移除。

(gh-24717)

重新定義 np.intp/np.uintp(幾乎永遠不會有變更)#

由於這些類型的實際使用幾乎總是與 size_t/Py_ssize_t 的使用相符,因此這現在是 C 語言中的定義。先前,它與 intptr_tuintptr_t 相符,這通常會有些微的不正確。這對絕大多數機器沒有影響,因為這些類型的大小僅在極少數的平台上有所不同。

但是,這表示

  • 指標可能不一定能再放入 intp 類型的陣列中。pP 字元碼仍然可以使用。

  • 在 C 語言中,仍然可以透過 PyArray_DescrFromType('p') 以跨平台的方式建立 intptr_tuintptr_t 類型的陣列。

  • 引入了新的字元碼 nN

  • 現在在剖析為 npy_intp 類型的引數時,使用 Python C-API 函數是正確的。

(gh-24888)

numpy.fft.helper 已設為私有#

numpy.fft.helper 已重新命名為 numpy.fft._helper,以指示它是私有子模組。它匯出的所有公用函數都應該從 numpy.fft 存取。

(gh-24945)

numpy.linalg.linalg 已設為私有#

numpy.linalg.linalg 已重新命名為 numpy.linalg._linalg,以指示它是私有子模組。它匯出的所有公用函數都應該從 numpy.linalg 存取。

(gh-24946)

超出範圍的軸與 axis=None 不同#

在某些情況下,axis=32 或對於 concatenate 任何大的值與 axis=None 相同。除了 concatenate 之外,這已被棄用。任何超出範圍的軸值現在都會產生錯誤,請務必使用 axis=None

(gh-25149)

用於 arrayasarray 建構函式的新 copy 關鍵字含義#

現在 numpy.arraynumpy.asarray 支援 copy 參數的三個值

  • None - 只有在必要時才會建立副本。

  • True - 總是建立副本。

  • False - 永遠不建立副本。如果需要副本,則會引發 ValueError

False 的含義已變更,因為如果需要副本,現在會引發例外狀況。

(gh-25168)

__array__ 特殊方法現在接受 copy 關鍵字引數。#

copy 將設定為非預設值的情況下(例如,在呼叫 np.asarray(some_object, copy=False) 時),NumPy 會將 copy 傳遞給 __array__ 特殊方法。目前,如果在此之後引發非預期的關鍵字引數錯誤,NumPy 將印出警告並在不使用 copy 關鍵字引數的情況下重試。實作 __array__ 協定的物件的實作應接受 copy 關鍵字引數,其含義與傳遞給 numpy.arraynumpy.asarray 時相同。

(gh-25168)

清理使用帶逗號字串初始化 numpy.dtype 的方式#

帶逗號字串的解譯方式略有變更,因為尾隨逗號現在始終會建立結構化 dtype。例如,先前 np.dtype("i")np.dtype("i,") 被視為相同,現在 np.dtype("i,") 將建立具有單一欄位的結構化 dtype。這類似於 np.dtype("i,i") 建立具有兩個欄位的結構化 dtype,並使行為與元組的預期行為一致。

同時,使用括號括住的單一數字來指示子陣列形狀(如 np.dtype("(2)i,") 中所示)的使用方式已被棄用。而是應該使用 np.dtype("(2,)i")np.dtype("2i")。最終,使用括號中的數字將會引發例外狀況,就像沒有逗號的初始化情況一樣,例如 np.dtype("(2)i")

(gh-25434)

複數符號的計算方式變更#

依照陣列 API 標準,複數符號現在計算為 z / |z|(而不是較不合邏輯的情況,即取實部的符號,除非實部為零,在這種情況下,則傳回虛部的符號)。與實數一樣,如果 z==0,則傳回零。

(gh-25441)

傳回陣列列表的函數的傳回類型#

傳回 ndarray 列表的函數已變更為傳回 ndarray 元組。每當傳回陣列序列時,都一致地傳回元組,這使得像 Numba 這樣的 JIT 編譯器,以及某些情況下的靜態類型檢查器,更容易支援這些函數。已變更的函數包括:atleast_1datleast_2datleast_3dbroadcast_arraysmeshgridogridhistogramdd

np.unique return_inverse 用於多維度輸入的形狀#

當多維度輸入傳遞給帶有 return_inverse=Truenp.unique 時,現在會對 unique_inverse 輸出進行塑形,以便在使用 axis=None 時,可以使用 np.take(unique, unique_inverse) 直接重建輸入,否則可以使用 np.take_along_axis(unique, unique_inverse, axis=axis)

注意

除了 axis=None 之外,此變更已在 2.0.1 中還原。正確的重建始終是 np.take(unique, unique_inverse, axis=axis)。當需要支援 2.0.0 時,請將 unique_inverse.reshape(-1) 新增至程式碼。

(gh-25553, gh-25570)

anyall 為物件陣列傳回布林值#

anyall 函數和方法現在也為物件陣列傳回布林值。先前,它們執行的縮減行為類似於 Python orand 運算子,後者評估為其中一個引數。您可以使用 np.logical_or.reducenp.logical_and.reduce 來實現先前的行為。

(gh-25712)

np.can_cast 無法在 Python int、float 或 complex 上呼叫#

np.can_cast 無法再使用 Python int、float 或 complex 實例呼叫。這是因為 NEP 50 表示 can_cast 的結果不得取決於傳入的值。不幸的是,對於 Python 純量,轉換是否應被視為 "same_kind""safe" 可能取決於上下文和值,因此目前尚未實作。在某些情況下,這表示您可能必須為以下情況新增特定路徑:if type(obj) in (int, float, complex): ...

(gh-26393)