NumPy 1.20.0 發行說明#

這個 NumPy 版本是至今為止最大的版本,合併了由 184 人貢獻的約 684 個 PR。詳情請參閱以下重點列表。此版本支援的 Python 版本為 3.7-3.9,已不再支援 Python 3.6。重點如下:

  • NumPy 函式的註解。這項工作正在進行中,預計會根據使用者的回饋進行改進。

  • 更廣泛地使用 SIMD 以提高 ufunc 的執行速度。在引入通用函式方面已完成許多工作,這些函式將簡化跨不同硬體平台使用現代功能。這項工作正在進行中。

  • 變更 dtype 和轉換實作的初步工作,以便為擴展 dtype 提供更輕鬆的路徑。這項工作正在進行中,但已完成足夠的工作以允許實驗和回饋。

  • 廣泛的文件改進,包括約 185 個 PR 合併。這項工作正在進行中,並且是改善 NumPy 線上形象和對新使用者實用性的更大專案的一部分。

  • 與移除 Python 2.7 相關的進一步清理。這提高了程式碼的可讀性並消除了技術債。

  • 初步支援即將推出的 Cython 3.0。

新函式#

`random.Generator` 類別有一個新的 permuted 函式。#

新函式與 shufflepermutation 的不同之處在於,它會置換由軸索引的子陣列,而不是將軸視為每個其他索引組合的單獨 1-D 陣列。例如,現在可以置換 2-D 陣列的行或列。

(gh-15121)

sliding_window_view 為 numpy 陣列提供滑動視窗視圖#

numpy.lib.stride_tricks.sliding_window_view 在 numpy 陣列上建構視圖,提供對陣列的滑動或移動視窗存取。這允許簡單地實作某些演算法,例如移動平均值。

(gh-17394)

numpy.broadcast_shapes 是一個新的使用者介面函式#

broadcast_shapes 從將給定的形狀元組相互廣播中取得結果形狀。

>>> np.broadcast_shapes((1, 2), (3, 1))
(3, 2)

>>> np.broadcast_shapes(2, (3, 1))
(3, 2)

>>> np.broadcast_shapes((6, 7), (5, 6, 1), (7,), (5, 1, 7))
(5, 6, 7)

(gh-17535)

棄用#

使用內建型別的別名(例如 np.int)已被棄用#

長期以來,np.int 一直是內建 int 的別名。這反覆成為新手的困惑原因,並且主要由於歷史原因而存在。

這些別名已被棄用。下表顯示了已棄用別名的完整列表,以及它們的確切含義。將第一欄中項目的使用替換為第二欄的內容將完全相同,並消除棄用警告。

第三欄列出了替代的 NumPy 名稱,這些名稱有時可能更佳。另請參閱 Data types 以取得更多詳細資訊。

已棄用的名稱

等同於

NumPy 純量型別名稱

numpy.bool

bool

numpy.bool_

numpy.int

int

numpy.int_ (預設值)、numpy.int64numpy.int32

numpy.float

float

numpy.float64numpy.float_numpy.double (等效)

numpy.complex

complex

numpy.complex128numpy.complex_numpy.cdouble (等效)

numpy.object

object

numpy.object_

numpy.str

str

numpy.str_

numpy.long

int

numpy.int_ (C long)、numpy.longlong (最大整數型別)

numpy.unicode

str

numpy.unicode_

為了為絕大多數情況提供明確的指南,對於 boolobjectstr (和 unicode) 型別,使用純版本更簡短明瞭,通常是很好的替代方案。對於 floatcomplex,如果您希望更明確地說明精度,可以使用 float64complex128

對於 np.int,直接替換為 np.int_int 也很好,並且不會改變行為,但精度將繼續取決於電腦和作業系統。如果您想更明確並檢查目前的使用情況,您可以選擇以下替代方案

  • np.int64np.int32 以精確指定精度。這確保結果不會取決於電腦或作業系統。

  • np.int_int (預設值),但請注意,它取決於電腦和作業系統。

  • C 型別:np.cint (int)、np.int_ (long)、np.longlong

  • np.intp 在 32 位元機器上為 32 位元,在 64 位元機器上為 64 位元。這可能是用於索引的最佳型別。

當與 np.dtype(...)dtype=... 一起使用時,將其變更為如上所述的 NumPy 名稱將對輸出沒有影響。如果用作純量,則

np.float(123)

變更它可能會微妙地改變結果。在這種情況下,Python 版本 float(123)int(12.) 通常更佳,儘管 NumPy 版本可能對於與 NumPy 陣列保持一致性很有用(例如,NumPy 對於除以零之類的情況行為有所不同)。

(gh-14882)

shape=None 傳遞給具有非可選形狀引數的函式已被棄用#

以前,這是傳遞 shape=() 的別名。此棄用由 C API 中的 PyArray_IntpConverter 發出。如果您的 API 旨在支援傳遞 None,則您應該在調用轉換器之前檢查 None,以便能夠區分 None()

(gh-15886)

即使索引結果為空,也會報告索引錯誤#

未來,即使非索引維度的長度為 0,當整數陣列索引包含超出範圍的值時,NumPy 也會引發 IndexError。現在將發出 DeprecationWarning。當陣列先前為空,或涉及空切片時,可能會發生這種情況

arr1 = np.zeros((5, 0))
arr1[[20]]
arr2 = np.zeros((5, 5))
arr2[[20], :0]

以前,非空索引 [20] 未檢查正確性。現在將檢查它,導致發出棄用警告,該警告將轉變為錯誤。這也適用於賦值。

(gh-15900)

modesearchside 的不精確匹配已被棄用#

早期,modesearchside 的不精確和不區分大小寫的匹配是有效的輸入,現在將給出 DeprecationWarning。例如,以下是一些現在已棄用並將給出 DeprecationWarning 的範例用法

import numpy as np
arr = np.array([[3, 6, 6], [4, 5, 1]])
# mode: inexact match
np.ravel_multi_index(arr, (7, 6), mode="clap")  # should be "clip"
# searchside: inexact match
np.searchsorted(arr[0], 4, side='random')  # should be "right"

(gh-16056)

棄用 numpy.dual#

模組 numpy.dual 已被棄用。函式應直接從 NumPy 或 SciPy 導入,而不是從 numpy.dual 導入函式。

(gh-16156)

outerufunc.outer 對於矩陣已被棄用#

np.matrixouter 或通用 ufunc 外部呼叫(例如 numpy.add.outer)一起使用。以前,矩陣在這裡被轉換為陣列。未來將不再這樣做,需要手動轉換為陣列。

(gh-16232)

進一步棄用數值樣式型別#

剩餘的數值樣式型別程式碼 Bytes0Str0Uint32Uint64Datetime64 已被棄用。應改用小寫變體。對於位元組和字串,"S""U" 是進一步的替代方案。

(gh-16554)

ndindexndincr 方法已被棄用#

自 NumPy 1.8 以來,文件已警告不要使用此函式。使用 next(it) 而不是 it.ndincr()

(gh-17233)

未定義 __len____getitem__ 的類陣列物件#

定義了 __array____array_interface____array_struct__ 協定之一但不是序列(通常由具有 __len____getitem__ 定義)的物件,未來在陣列強制轉換期間的行為將有所不同。

當巢狀在序列中時,例如 np.array([array_like]),這些被視為單個 Python 物件而不是陣列。未來,它們的行為將與以下內容相同:

np.array([np.array(array_like)])

只有當 np.array(array_like) 不是 0-D 時,此變更才會生效。此警告的解決方案可能取決於物件

  • 某些類陣列物件可能預期新的行為,使用者可以忽略警告。物件可以選擇公開序列協定以選擇加入新行為。

  • 例如,shapely 將允許使用 line.coords 而不是 np.asarray(line) 轉換為類陣列物件。使用者可以繞過警告,或在新的慣例可用時使用它。

遺憾的是,使用新行為只能透過呼叫 np.array(array_like) 來實現。

如果您希望確保舊行為保持不變,請建立一個物件陣列,然後明確地填充它,例如

arr = np.empty(3, dtype=object)
arr[:] = [array_like1, array_like2, array_like3]

這將確保 NumPy 知道不要進入類陣列物件,而是將其用作物件。

(gh-17973)

未來的變更#

陣列不能使用子陣列 dtype#

dtype 是子陣列 dtype(例如 np.dtype("(2)i,"))時,使用 np.array(arr, dtype)arr.astype(dtype) 建立和轉換陣列將使用不同的邏輯。

對於這樣的 dtype,以下行為為真

res = np.array(arr, dtype)

res.dtype is not dtype
res.dtype is dtype.base
res.shape == arr.shape + dtype.shape

res 是使用以下邏輯填充的

res = np.empty(arr.shape + dtype.shape, dtype=dtype.base)
res[...] = arr

這使用了不正確的廣播(並且經常導致錯誤)。未來,這將改為單獨轉換每個元素,導致與以下內容相同的結果

res = np.array(arr, dtype=np.dtype(["f", dtype]))["f"]

通常可以用於選擇加入新行為。

除非 list 本身包含至少一個陣列,否則此變更不會影響 np.array(list, dtype="(2)i,")。特別是,對於元組列表,行為保持不變。

(gh-17596)

過期的棄用#

  • 數值樣式型別程式碼 np.dtype("Complex64")(使用大寫拼寫)的棄用已過期。"Complex64" 對應於 "complex128",而 "Complex32" 對應於 "complex64"

  • np.sctypeNAnp.typeNA 的棄用已過期。兩者都已從公共 API 中移除。請改用 np.typeDict

    (gh-16554)

  • np.ctypeslib.ctypes_load_library 的 14 年棄用已過期。請改用 load_library,它是相同的。

    (gh-17116)

財務函式已移除#

根據 NEP 32,財務函式已從 NumPy 1.20 中移除。已移除的函式為 fvipmtirrmirrnpernpvpmtppmtpvrate。這些函式可在 numpy_financial 庫中使用。

(gh-17067)

相容性注意事項#

isinstance(dtype, np.dtype) 而不是 type(dtype) is not np.dtype#

NumPy dtype 不再是 np.dtype 的直接實例。可能使用過 type(dtype) is np.dtype 的程式碼將始終返回 False,並且必須更新為使用正確的版本 isinstance(dtype, np.dtype)

如果針對舊於 1.16.6 的 NumPy 編譯,此變更也會影響 C 端的巨集 PyArray_DescrCheck。如果程式碼使用此巨集並希望針對舊版本的 NumPy 進行編譯,則必須替換該巨集(另請參閱 C API 變更章節)。

在 concatenate 中使用 axis=None 進行相同類型的轉換#

當使用 axis=None 呼叫 concatenate 時,展平的陣列會使用 unsafe 進行轉換。任何其他軸選擇都使用「相同類型」。不同的預設值已被棄用,將改為使用「相同類型」轉換。可以使用新的 casting 關鍵字引數來保留舊行為。

(gh-16134)

將 NumPy 純量賦值給陣列時會進行轉換#

在建立或賦值給陣列時,在所有相關情況下,NumPy 純量現在將以與 NumPy 陣列相同的方式進行轉換。特別是,這改變了先前在某些情況下引發錯誤的行為

np.array([np.float64(np.nan)], dtype=np.int64)

將成功並返回未定義的結果(通常是最小的可能整數)。這也會影響賦值

arr[0] = np.float64(np.nan)

目前,NumPy 保留了以下行為

np.array(np.float64(np.nan), dtype=np.int64)

以上變更不會影響 Python 純量

np.array([float("NaN")], dtype=np.int64)

保持不受影響(np.nan 是 Python float,而不是 NumPy 的)。與帶符號整數不同,無符號整數不保留此特殊情況,因為它們的行為始終更像轉換。以下程式碼不再引發錯誤

np.array([np.float64(np.nan)], dtype=np.uint64)

為了避免向後相容性問題,目前仍然支援從 datetime64 純量賦值給長度過短的字串。這表示 np.asarray(np.datetime64("2020-10-10"), dtype="S5") 現在成功了,而以前會失敗。從長遠來看,這可能會被棄用,或者可能普遍允許不安全的轉換,以使陣列和純量的賦值行為保持一致。

當字串和其他型別混合時,陣列強制轉換會發生變更#

當字串和其他型別混合時,例如

np.array(["string", np.float64(3.)], dtype="S")

結果將會改變,這在某些情況下可能會導致具有更長字串的字串 dtype。特別是,如果未提供 dtype="S",則任何數值都將導致字串結果足夠長,以容納所有可能的數值。(例如,浮點數為 “S32”)。請注意,將非字串轉換為字串時,應始終提供 dtype="S"

如果提供了 dtype="S",則結果將與以前大致相同,但 NumPy 純量(不是像 1.0 這樣的 Python 浮點數)仍將強制執行統一的字串長度

np.array([np.float64(3.)], dtype="S")  # gives "S32"
np.array([3.0], dtype="S")  # gives "S3"

以前,第一個版本給出的結果與第二個版本相同。

陣列強制轉換重組#

陣列強制轉換已重組。一般來說,這不應影響使用者。在類陣列物件巢狀的極少數邊角情況下

np.array([array_like1])

現在事情將更符合以下內容

np.array([np.array(array_like1)])

這可能會微妙地改變某些定義不佳的類陣列物件的輸出。其中一個範例是不也是匹配形狀序列的類陣列物件。在 NumPy 1.20 中,當類陣列物件也不序列時,將給出警告(但行為保持不變,請參閱棄用)。如果類陣列物件也是序列(定義了 __getitem____len__),則 NumPy 現在將僅使用由 __array____array_interface____array_struct__ 給出的結果。當(巢狀)序列描述不同的形狀時,這將導致差異。

(gh-16200)

寫入 numpy.broadcast_arrays 的結果將匯出唯讀緩衝區#

在 NumPy 1.17 中,當寫入結果陣列時,numpy.broadcast_arrays 開始發出警告。當透過緩衝區介面(例如 memoryview(arr))使用陣列時,此警告被跳過。現在,對於兩個協定 __array_interface____array_struct__,將發生相同的事情,返回唯讀緩衝區而不是發出警告。

(gh-16350)

數值樣式型別名稱已從型別字典中移除#

為了與 np.dtype("Complex64") 和其他數值樣式(大寫)型別的棄用保持同步。這些已從 np.sctypeDictnp.typeDict 中移除。您應該改用小寫版本。請注意,"Complex64" 對應於 "complex128",而 "Complex32" 對應於 "complex64"。numpy 樣式(新)版本表示完整大小,而不是實部/虛部的大小。

(gh-16554)

operator.concat 函式現在會針對陣列引數引發 TypeError#

先前的行為是回退到加法並將兩個陣列相加,這被認為對於串聯函數來說是出乎意料的行為。

(gh-16570)

nickname 屬性已從 ABCPolyBase 移除#

抽象屬性 nickname 已從 ABCPolyBase 中移除,因為在衍生的便利類別中已不再使用。這可能會影響從 ABCPolyBase 衍生類別並覆寫表示和顯示方法的用戶,例如 __str____repr___repr_latex 等。

(gh-16589)

float->timedeltauint64->timedelta 提升將引發 TypeError#

Float 和 timedelta 提升會一致地引發 TypeError。np.promote_types("float32", "m8") 現在與 np.promote_types("m8", "float32") 對齊,並且兩者都會引發 TypeError。先前,np.promote_types("float32", "m8") 返回 "m8",這被認為是一個錯誤。

Uint64 和 timedelta 提升會一致地引發 TypeError。np.promote_types("uint64", "m8") 現在與 np.promote_types("m8", "uint64") 對齊,並且兩者都會引發 TypeError。先前,np.promote_types("uint64", "m8") 返回 "m8",這被認為是一個錯誤。

(gh-16592)

numpy.genfromtxt 現在可以正確地解包結構化陣列#

先前,如果使用 unpack=True 呼叫 numpy.genfromtxt,並且將結構化資料類型傳遞給 dtype 參數(或傳遞 dtype=None 並推斷出結構化資料類型),則會解包失敗。例如

>>> data = StringIO("21 58.0\n35 72.0")
>>> np.genfromtxt(data, dtype=None, unpack=True)
array([(21, 58.), (35, 72.)], dtype=[('f0', '<i8'), ('f1', '<f8')])

結構化陣列現在將正確地解包成陣列列表,每列一個陣列

>>> np.genfromtxt(data, dtype=None, unpack=True)
[array([21, 35]), array([58., 72.])]

(gh-16650)

mgridr_ 等,對於非預設精度的輸入,會一致地返回正確的輸出#

先前,np.mgrid[np.float32(0.1):np.float32(0.35):np.float32(0.1),]np.r_[0:10:np.complex64(3j)] 無法返回有意義的輸出。當使用 dtype 不是預設 float64complex128 以及等效 Python 類型的輸入時,此錯誤可能會影響 mgridogridr_c_。這些方法已修正,可以正確處理不同的精度。

(gh-16815)

布林陣列索引與不匹配的形狀現在會正確地給出 IndexError#

先前,如果布林陣列索引與被索引陣列的大小匹配,但與形狀不匹配,則在某些情況下會錯誤地允許。在其他情況下,它會給出錯誤,但錯誤不正確地是 ValueError,並帶有關於廣播的消息,而不是正確的 IndexError

例如,以下程式碼過去會錯誤地給出 ValueError: operands could not be broadcast together with shapes (2,2) (1,4)

np.empty((2, 2))[np.array([[True, False, False, False]])]

以下程式碼過去會錯誤地返回 array([], dtype=float64)

np.empty((2, 2))[np.array([[False, False, False, False]])]

現在兩者都會正確地給出 IndexError: boolean index did not match indexed array along dimension 0; dimension is 2 but corresponding boolean dimension is 1

(gh-17010)

轉換錯誤會中斷迭代#

當在迭代時轉換值時,錯誤可能會比以前更早停止迭代。在任何情況下,失敗的轉換操作始終返回未定義的部分結果。現在這些結果可能會更加未定義和不完整。對於 NpyIter C-API 的使用者來說,此類轉換錯誤現在將導致 iternext() 函數返回 0,從而中止迭代。目前,沒有 API 可以直接偵測到此類錯誤。有必要檢查 PyErr_Occurred(),這在與 NpyIter_Reset 結合使用時可能會出現問題。這些問題一直存在,但如果使用者需要,可以添加新的 API。

(gh-17029)

f2py 生成的程式碼可能會返回 unicode 而不是位元組字串#

先前由 f2py 生成的程式碼返回的一些位元組字串現在可能是 unicode 字串。這是由於正在進行的 Python2 -> Python3 清理所導致的。

(gh-17068)

__array_interface__["data"] 元組的第一個元素必須是整數#

多年以來,這一直是文件化的介面,但仍然有程式碼會接受指標位址的位元組字串表示形式。該程式碼已被移除,將位址作為位元組字串傳遞現在將引發錯誤。

(gh-17241)

poly1d 尊重全零參數的 dtype#

先前,使用全零係數建構 poly1d 的實例會將係數轉換為 np.float64。這會影響在內部建構 poly1d 實例的方法的輸出 dtype,例如 np.polymul

(gh-17577)

swig 的 numpy.i 檔案僅適用於 Python 3。#

Python 2.7 C-API 函數的使用已更新為僅適用於 Python 3。需要舊版本的用戶應從舊版本的 NumPy 中取得。

(gh-17580)

np.array 中的 Void dtype 探索#

在使用 np.array(..., dtype="V")arr.astype("V") 和類似呼叫中,除非所有元素都具有相同的 void 長度,否則現在將正確引發 TypeError。一個例子是

np.array([b"1", b"12"], dtype="V")

先前返回的陣列其 dtype 為 "V2",無法忠實地表示 b"1"

(gh-17706)

C API 變更#

PyArray_DescrCheck 巨集已修改#

自 NumPy 1.16.6 以來,PyArray_DescrCheck 巨集已更新為

#define PyArray_DescrCheck(op) PyObject_TypeCheck(op, &PyArrayDescr_Type)

從 NumPy 1.20 開始,針對較早版本編譯的程式碼將與 NumPy 1.20 的 API 不相容。修復方法是針對 1.16.6 進行編譯(如果 NumPy 1.16 版本是您希望支援的最舊版本),或手動內聯巨集,將其替換為新定義

PyObject_TypeCheck(op, &PyArrayDescr_Type)

它與所有 NumPy 版本相容。

np.ndarraynp.void_ 的大小已變更#

PyArrayObjectPyVoidScalarObject 結構的大小已變更。以下標頭定義已被移除

#define NPY_SIZEOF_PYARRAYOBJECT (sizeof(PyArrayObject_fields))

因為大小不應被視為編譯時常數:它會隨著 NumPy 的不同運行時版本而改變。

最有可能相關的用途是以 C 語言編寫的潛在子類別,它們將必須重新編譯並且應該更新。有關更多詳細資訊,請參閱 PyArrayObject 的文件,如果您受到此變更的影響,請聯絡 NumPy 開發人員。

NumPy 將嘗試給出優雅的錯誤,但期望固定結構大小的程式可能會有未定義的行為並可能崩潰。

(gh-16938)

新功能#

numpy.allnumpy.any 函數的 where 關鍵字參數#

新增了關鍵字參數 where,它允許在 allany 的布林評估中僅考慮陣列中指定的元素或子軸。這個新關鍵字可透過直接使用 numpy 或在 numpy.ndarray 的方法中使用函數 allany

任何可廣播的布林陣列或純量都可以設定為 where。如果使用者未設定 where,則預設為 True,以評估陣列中所有元素的函數。函數的文件中提供了範例。

numpy 函數 meanstdvarwhere 關鍵字參數#

新增了關鍵字參數 where,它允許將 meanstdvar 的計算範圍限制為僅元素子集。它可透過直接使用 numpy 或在 numpy.ndarray 的方法中使用。

任何可廣播的布林陣列或純量都可以設定為 where。如果使用者未設定 where,則預設為 True,以評估陣列中所有元素的函數。函數的文件中提供了範例。

(gh-15852)

numpy.fft 函數的 norm=backwardforward 關鍵字選項#

新增了關鍵字參數選項 norm=backward 作為 None 的別名,並作為預設選項;使用它會使直接轉換不縮放,而反向轉換縮放 1/n

使用新的關鍵字參數選項 norm=forward 會使直接轉換縮放 1/n,而反向轉換不縮放(即與預設選項 norm=backward 完全相反)。

(gh-16476)

NumPy 現在已輸入類型化#

已為 NumPy 的大部分新增了類型註解。還有一個新的 numpy.typing 模組,其中包含對終端使用者有用的類型。目前可用的類型為

  • ArrayLike:適用於可以強制轉換為陣列的物件

  • DtypeLike:適用於可以強制轉換為 dtype 的物件

(gh-16515)

numpy.typing 在運行時可存取#

現在可以在運行時匯入 numpy.typing 中的類型。如下所示的程式碼現在可以運作

from numpy.typing import ArrayLike
x: ArrayLike = [1, 2, 3, 4]

(gh-16558)

f2py 生成的模組的新 __f2py_numpy_version__ 屬性。#

由於 f2py 與 NumPy 一起發布,__f2py_numpy_version__ 提供了一種追蹤用於生成模組的 f2py 版本的方法。

(gh-16594)

mypy 測試可以透過 runtests.py 運行#

目前,使用已設定的 NumPy stubs 運行 mypy 需要

  • 安裝 NumPy

  • 將原始碼目錄新增到 MYPYPATH 並連結到 mypy.ini

這兩個選項都有點不方便,因此新增一個 --mypy 選項到 runtests,它可以處理為您設定事情。這在未來對於任何類型化程式碼生成也很有用,因為它可以確保專案在類型檢查之前已建置。

(gh-17123)

使用者定義的 BLAS/LAPACK 偵測順序的否定#

當確定 BLAS/LAPACK 程式庫時,distutils 允許否定程式庫。這可以用於從程式庫解析階段中移除項目,即為了不允許 NetLIB 程式庫,可以執行以下操作

NPY_BLAS_ORDER='^blas' NPY_LAPACK_ORDER='^lapack' python setup.py build

它將改為使用任何加速程式庫。

(gh-17219)

允許將優化參數傳遞給 asv build#

現在可以在使用 --bench-compare 參數時,將 -j--cpu-baseline--cpu-dispatch--disable-optimization 旗標傳遞給 ASV build。

(gh-17284)

現在支援 NVIDIA HPC SDK nvfortran 編譯器#

已新增對 nvfortran 編譯器(pgfortran 的一個版本)的支援。

(gh-17344)

covcorrcoefdtype 選項#

現在 numpy.covnumpy.corrcoef 提供 dtype 選項。它指定返回結果應具有的資料類型。預設情況下,函數仍然返回 numpy.float64 結果。

(gh-17456)

改進#

改進了多項式的字串表示形式 (__str__)#

已更新 numpy.polynomial 中所有六種多項式類型的字串表示形式 (__str__),以將多項式表示為數學表達式,而不是係數陣列。多項式表達式有兩種套件範圍的格式可供使用 - 一種使用 Unicode 字元表示上標和下標,另一種僅使用 ASCII 字元。

(gh-15666)

移除 Accelerate 程式庫作為候選 LAPACK 程式庫#

Apple 不再支援 Accelerate。移除它。

(gh-15759)

包含多行物件的物件陣列具有更易讀的 repr#

如果物件陣列的元素具有包含換行符號的 repr,則換行的行將按列對齊。值得注意的是,這改進了巢狀陣列的 repr

>>> np.array([np.eye(2), np.eye(3)], dtype=object)
array([array([[1., 0.],
              [0., 1.]]),
       array([[1., 0., 0.],
              [0., 1., 0.],
              [0., 0., 1.]])], dtype=object)

(gh-15997)

串聯支援提供輸出 dtype#

已新增對 concatenate 的支援,以使用關鍵字參數提供輸出 dtypecastingdtype 參數不能與 out 參數一起提供。

(gh-16134)

執行緒安全 f2py 回呼函數#

f2py 中的回呼函數現在是執行緒安全的。

(gh-16519)

numpy.core.records.fromfile 現在支援類檔案物件#

numpy.core.records.fromfile 現在可以使用類檔案物件,例如 io.BytesIO

(gh-16675)

RPATH 在 AIX 上的支援已新增至 distutils#

這允許在 AIX 上建置 SciPy。

(gh-16710)

使用命令列引數指定的 f90 編譯器#

已在 numpy.distutils.fcompiler 中變更 Fortran Portland Group Compiler 的編譯器命令選擇。這僅影響連結命令。這會強制使用命令列選項(如果提供)提供的可執行檔,而不是 pgfortran 可執行檔。如果未向命令列選項提供可執行檔,則預設為 pgf90 可執行檔,根據 PGI 文件,它是 pgfortran 的別名。

(gh-16730)

為 Cython 3.0 及更高版本新增 NumPy 宣告#

已改進 Cython 3.0 的 pxd 宣告,以避免使用已棄用的 NumPy C-API 功能。使用 Cython 3.0+ 建置且使用 NumPy 的擴充模組現在可以設定 C 巨集 NPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION,以避免關於已棄用 API 使用的 C 編譯器警告。

(gh-16986)

使視窗函數完全對稱#

確保 NumPy 提供的視窗函數是對稱的。先前由於數值精度,對稱性存在細微偏差,現在透過更好地安排計算來避免這些偏差。

(gh-17195)

效能改進和變更#

啟用多平台 SIMD 編譯器最佳化#

NumPy 基礎架構的一系列改進,為 NEP-38 鋪路,可以總結如下

  • 新的建置引數

    • --cpu-baseline 指定所需最佳化的最小集合,預設值為 min,它提供了可以在廣泛使用者平台上安全運行的最小 CPU 功能。

    • --cpu-dispatch 指定額外最佳化的調度集合,預設值為 max -xop -fma4,它啟用所有 CPU 功能,AMD 舊版功能除外。

    • --disable-optimization 明確停用所有新的改進,它還新增了一個新的 C 編譯器 #definition,稱為 NPY_DISABLE_OPTIMIZATION,它可以作為任何 SIMD 程式碼的防護。

  • 進階 CPU 調度器

    一個靈活的跨架構 CPU 調度器,建立在 Python/Numpy distutils 之上,支援所有常見的編譯器和廣泛的 CPU 功能。

    新的調度器需要特殊的檔案擴展名 *.dispatch.c 來標記可調度的 C 原始碼。這些原始碼能夠被多次編譯,以便每個編譯過程代表特定的 CPU 功能,並提供影響程式碼路徑的不同 #definition 和旗標。

  • 新的自動生成 C 標頭 ``core/src/common/_cpu_dispatch.h``

    此標頭由 distutils 模組 ccompiler_opt 生成,並包含指令集的所有 #definition 和標頭,這些指令集已透過命令引數 '–cpu-baseline' 和 '–cpu-dispatch' 進行配置。

  • 新的 C 標頭 ``core/src/common/npy_cpu_dispatch.h``

    此標頭包含整個 CPU 調度過程所需的所有實用程式,它也可以被視為連接新基礎架構工作與 NumPy CPU 運行時偵測的橋樑。

  • 將新屬性新增到 NumPy umath 模組(Python 層級)

    • __cpu_baseline__ 一個列表,其中包含編譯器和平台根據命令引數 '–cpu-baseline' 的指定值支援的所需最佳化的最小集合。

    • __cpu_dispatch__ 一個列表,其中包含編譯器和平台根據命令引數 '–cpu-dispatch' 的指定值支援的額外最佳化的調度集合。

  • 在 PytestTester 運行期間列印支援的 CPU 功能

(gh-13516)

變更#

整數上的 np.linspace 現在使用 floor#

當在 numpy.linspace 中使用 int dtype 時,先前的浮點值會向零捨入。現在改為使用 numpy.floor,它會向 -inf 捨入。這會變更負值的結果。例如,以下程式碼先前會給出

>>> np.linspace(-3, 1, 8, dtype=int)
array([-3, -2, -1, -1,  0,  0,  0,  1])

現在會產生

>>> np.linspace(-3, 1, 8, dtype=int)
array([-3, -3, -2, -2, -1, -1,  0,  1])

先前的結果仍然可以使用以下程式碼獲得

>>> np.linspace(-3, 1, 8).astype(int)
array([-3, -2, -1, -1,  0,  0,  0,  1])

(gh-16841)