NumPy 1.23.0 版本說明#

NumPy 1.23.0 版本持續進行改進 dtypes 的處理和升級、提高執行速度、釐清文件以及過期舊的棄用警告。重點如下

  • `loadtxt` 在 C 語言中的實作,大幅提升其效能。

  • 在 Python 層級公開 DLPack,以便輕鬆進行資料交換。

  • 結構化 dtypes 的升級和比較變更。

  • f2py 的改進。

詳細資訊請見下方:

新功能#

  • `ndenumerate` 的遮罩陣列特化版本現在以 `numpy.ma.ndenumerate` 提供。它提供 `numpy.ndenumerate` 的替代方案,並預設跳過遮罩值。

    (gh-20020)

  • 已新增 `numpy.from_dlpack` 以允許使用 DLPack 協定輕鬆交換資料。它接受實作 `__dlpack__` 和 `__dlpack_device__` 方法的 Python 物件,並傳回一個 ndarray 物件,該物件通常是輸入物件資料的視圖。

    (gh-21145)

棄用#

  • 將 `__array_finalize__` 設定為 `None` 已被棄用。現在它必須是一個方法,並且在檢查 `None` 或 NumPy 版本是否足夠新之後,可能需要呼叫 `super().__array_finalize__(obj)`。

    (gh-20766)

  • 在許多情況下,使用 `axis=32` (`axis=np.MAXDIMS`) 與 `axis=None` 具有相同的含義。這已被棄用,必須改用 `axis=None`。

    (gh-20920)

  • hook 函式 `PyDataMem_SetEventHook` 已被棄用,並且 tool/allocation_tracking 中使用它的示範已被移除。追蹤記憶體分配的功能現在已透過 `tracemalloc` 內建於 python 中。

    (gh-20394)

  • `numpy.distutils` 已被棄用,因為 `distutils` 本身也被棄用。在 Python >= 3.12 的 NumPy 中將不會出現,並將在 Python 3.12 發布 2 年後完全移除。如需更多詳細資訊,請參閱 Status of numpy.distutils and migration advice

    (gh-20875)

  • 當請求整數 `dtype` 但值格式為浮點數時,`numpy.loadtxt` 現在會發出 `DeprecationWarning`。

    (gh-21663)

已過期的棄用#

  • `NpzFile.iteritems()` 和 `NpzFile.iterkeys()` 方法已被移除,作為持續移除 Python 2 相容性的一部分。這結束了從 1.15 開始的棄用。

    (gh-16830)

  • `alen` 和 `asscalar` 函式已被移除。

    (gh-20414)

  • `UPDATEIFCOPY` 陣列旗標已連同列舉 `NPY_ARRAY_UPDATEIFCOPY` 一起移除。相關聯的(且已棄用的)`PyArray_XDECREF_ERR` 也被移除。這些都在 1.14 中被棄用。它們被 `NPY_ARRAY_WRITEBACKIFCOPY` 取代,後者需要在陣列取消分配之前呼叫 `PyArray_ResolveWritebackIfCopy`。

    (gh-20589)

  • 在類陣列建立期間將會引發例外。當物件在存取特殊屬性 `__array__` 或 `__array_interface__` 期間引發例外時,此例外通常會被忽略。此行為在 1.21 中已被棄用,現在將會引發例外。

    (gh-20835)

  • 不允許使用非元組值進行多維索引。先前,像 `arr[ind]` 這樣的程式碼,其中 `ind = [[0, 1], [0, 1]]` 會產生 `FutureWarning` 並被解釋為多維索引(即 `arr[tuple(ind)]`)。現在,此範例被視為單一維度上的陣列索引 (`arr[array(ind)]`)。在 NumPy 1.15 中,已棄用使用元組以外的任何內容進行多維索引。

    (gh-21029)

  • 不再允許在 F 連續陣列中變更為不同大小的 dtype。自 Numpy 1.11.0 起已棄用。請參閱下方以取得此變更影響的詳細說明。

    (gh-20722)

新功能#

crackfortran 支援運算符和賦值重載#

`crackfortran` 解析器現在理解模組中的運算符和賦值定義。它們被添加到模組的 `body` 列表中,該列表包含一個新的鍵 `implementedby`,列出實作運算符或賦值的子例程或函式的名稱。

(gh-15006)

f2py 支援從衍生類型語句讀取存取類型屬性#

因此,不需要使用 `public` 或 `private` 語句來指定衍生類型存取屬性。

(gh-15844)

新增參數 `ndmin` 到 `genfromtxt`#

此參數的行為與 `numpy.loadtxt` 中的 `ndmin` 相同。

(gh-20500)

`np.loadtxt` 現在支援引號字元和單一轉換器函式#

`numpy.loadtxt` 現在支援額外的 `quotechar` 關鍵字引數,預設未設定。使用 `quotechar='"'` 將會讀取 Excel CSV 方言中使用的引號欄位。

此外,現在可以為 `converters` 引數傳遞單一可呼叫物件,而不是字典。

(gh-20580)

變更為不同大小的 dtype 現在只需要最後一個軸的連續性#

先前,使用不同項目大小的 dtype 檢視陣列需要整個陣列是 C 連續的。此限制會不必要地迫使用戶在能夠變更 dtype 之前,先製作非連續陣列的連續副本。

此變更不僅影響 `ndarray.view`,還影響其他建構機制,包括不建議直接賦值給 `ndarray.dtype`。

此變更使有關檢視 F 連續陣列的棄用過期,該棄用在版本說明的其他地方有描述。

(gh-20722)

F2PY 的確定性輸出檔案#

對於 F77 輸入,`f2py` 將無條件產生 `modname-f2pywrappers.f`,儘管這些檔案可能是空的。對於自由格式輸入,將無條件產生 `modname-f2pywrappers.f`、`modname-f2pywrappers2.f90`,並且可能為空。這允許在 `cmake` 或 `meson` 和其他建置系統中編寫通用輸出規則。可以通過將 `--skip-empty-wrappers` 傳遞給 `f2py` 來恢復舊的行為。使用 via meson 詳細說明了用法。

(gh-21187)

`average` 的 `keepdims` 參數#

參數 `keepdims` 已新增至函式 `numpy.average` 和 `numpy.ma.average`。此參數的含義與在縮減函式(例如 `numpy.sum` 或 `numpy.mean`)中的含義相同。

(gh-21485)

新增參數 `equal_nan` 到 `np.unique`#

`np.unique` 在 1.21 中被更改為將所有 `NaN` 值視為相等並傳回單一 `NaN`。設定 `equal_nan=False` 將恢復 1.21 之前的行為,將 `NaNs` 視為唯一值。預設值為 `True`。

(gh-21623)

相容性注意事項#

1D `np.linalg.norm` 保留浮點輸入類型,即使對於純量結果也是如此#

先前,當 `ord` 引數不是明確列出的值之一時,例如 `ord=3`,這會升級為 `float64`

>>> f32 = np.float32([1, 2])
>>> np.linalg.norm(f32, 2).dtype
dtype('float32')
>>> np.linalg.norm(f32, 3)
dtype('float64')  # numpy 1.22
dtype('float32')  # numpy 1.23

此變更僅影響 `float32` 和 `float16` 向量,其 `ord` 不是 `-Inf`、`0`、`1`、`2` 和 `Inf`。

(gh-17709)

結構化 (void) dtype 升級和比較的變更#

一般來說,NumPy 現在為結構化 dtypes 定義了正確但略有限制的升級,方法是升級每個欄位的子類型,而不是引發例外

>>> np.result_type(np.dtype("i,i"), np.dtype("i,d"))
dtype([('f0', '<i4'), ('f1', '<f8')])

對於升級,強制執行符合的欄位名稱、順序和標題,但忽略填充。涉及結構化 dtypes 的升級現在始終確保所有欄位的原生位元組順序(這可能會更改 `np.concatenate` 的結果),並確保結果將是「packed」,即所有欄位都是連續排序的,並且移除了填充。有關更多詳細資訊,請參閱 Structure comparison and promotion

對齊結構的 `repr` 現在永遠不會印出包含 `offsets` 和 `itemsize` 的長格式,除非結構包含 `align=True` 未保證的填充。

為了與上述升級邏輯的變更保持一致,已更新類型轉換安全性

  • `"equiv"` 強制執行符合的名稱和標題。允許項目大小因填充而異。

  • `"safe"` 允許不符合的欄位名稱和標題

  • 類型轉換安全性受到每個包含欄位的類型轉換安全性的限制。

  • 欄位的順序用於決定每個單獨欄位的類型轉換安全性。先前,使用欄位名稱,並且僅當名稱不符時才可能進行不安全的類型轉換。

這裡主要的重要變更是,名稱不符現在被視為「安全」類型轉換。

(gh-19226)

`NPY_RELAXED_STRIDES_CHECKING` 已被移除#

NumPy 無法再使用 `NPY_RELAXED_STRIDES_CHECKING=0` 編譯。寬鬆 strides 已成為多年的預設值,並且最初引入該選項是為了允許更平滑的過渡。

(gh-20220)

`np.loadtxt` 已收到多項變更#

`numpy.loadtxt` 的列計數已修復。`loadtxt` 忽略檔案中的完全空行,但將它們計入 `max_rows`。當使用 `max_rows` 且檔案包含空行時,這些現在將不會被計算在內。先前,即使有更多資料可供讀取,結果也可能包含少於 `max_rows` 列。如果需要舊的行為,可以使用 `itertools.islice`

import itertools
lines = itertools.islice(open("file"), 0, max_rows)
result = np.loadtxt(lines, ...)

雖然通常更快且有所改進,但 `numpy.loadtxt` 現在可能無法將某些字串轉換為先前成功讀取的數字。最重要的情況是

  • 將浮點數值(例如 `1.0`)解析為整數現在已被棄用。

  • 解析十六進位浮點數(例如 `0x3p3`)將會失敗

  • 先前,`_` 被接受為千位分隔符號 `100_000`。現在這將導致錯誤。

如果您遇到這些限制,可以通過傳遞適當的 `converters=` 來解決所有這些問題。NumPy 現在支援傳遞單一轉換器以用於所有欄位,以使其更方便。例如,`converters=float.fromhex` 可以讀取十六進位浮點數,而 `converters=int` 將能夠讀取 `100_000`。

此外,錯誤訊息已普遍改進。但是,這表示錯誤類型可能有所不同。特別是,當單一條目的解析失敗時,現在始終會引發 `ValueError`。

(gh-20580)

改進#

`ndarray.__array_finalize__` 現在可呼叫#

這表示子類別現在可以使用 `super().__array_finalize__(obj)`,而無需擔心 `ndarray` 是否是它們的超類別。實際呼叫仍然是 no-op。

(gh-20766)

新增對 VSX4/Power10 的支援#

透過啟用 VSX4/Power10,Power ISA 3.1 中可用的新指令可用於加速某些 NumPy 運算,例如 floor_divide、modulo 等。

(gh-20821)

`np.fromiter` 現在接受物件和子陣列#

`numpy.fromiter` 函式現在支援物件和子陣列 dtypes。請參閱函式文件以取得範例。

(gh-20993)

Math C 函式庫功能偵測現在使用正確的簽名#

編譯之前有一個偵測階段,以確定底層 libc 是否支援某些數學運算。先前,此程式碼未遵循正確的簽名。修復此問題可啟用 `wasm-ld` 後端(用於 WebAssembly 的編譯)的編譯,並減少警告的數量。

(gh-21154)

`np.kron` 現在維護子類別資訊#

`np.kron` 現在維護子類別資訊,例如在計算輸入的 Kronecker 乘積時的遮罩陣列

>>> x = ma.array([[1, 2], [3, 4]], mask=[[0, 1], [1, 0]])
>>> np.kron(x,x)
masked_array(
  data=[[1, --, --, --],
        [--, 4, --, --],
        [--, --, 4, --],
        [--, --, --, 16]],
  mask=[[False,  True,  True,  True],
        [ True, False,  True,  True],
        [ True,  True, False,  True],
        [ True,  True,  True, False]],
  fill_value=999999)

警告

`np.kron` 輸出現在遵循 `ufunc` 排序 (`multiply`) 來確定輸出類別類型

>>> class myarr(np.ndarray):
>>>    __array_priority__ = -1
>>> a = np.ones([2, 2])
>>> ma = myarray(a.shape, a.dtype, a.data)
>>> type(np.kron(a, ma)) == np.ndarray
False # Before it was True
>>> type(np.kron(a, ma)) == myarr
True

(gh-21262)

效能改進和變更#

更快的 `np.loadtxt`#

`numpy.loadtxt` 現在通常比以前快得多,因為它的大部分現在是用 C 語言實作的。

(gh-20580)

更快的縮減運算符#

在連續的基於整數的陣列上,縮減運算(例如 `numpy.sum`、`numpy.prod`、`numpy.add.reduce`、`numpy.logical_and.reduce`)現在快得多。

(gh-21001)

更快的 `np.where`#

`numpy.where` 現在在不可預測/隨機輸入資料上比以前快得多。

(gh-21130)

NumPy 純量上更快的運算#

NumPy 純量上的許多運算現在都顯著加快,儘管在某些情況下,罕見的運算(例如,使用 0-D 陣列而不是純量)可能會變慢。但是,即使有了這些改進,想要獲得最佳純量效能的使用者,可能仍希望使用 `scalar.item()` 將已知的 NumPy 純量轉換為 Python 純量。

(gh-21188)

更快的 `np.kron`#

`numpy.kron` 大約快 80%,因為現在使用廣播計算乘積。

(gh-21354)