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
函式。#
新函式與 shuffle
和 permutation
的不同之處在於,它會置換由軸索引的子陣列,而不是將軸視為每個其他索引組合的單獨 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.unicode_ |
為了為絕大多數情況提供明確的指南,對於 bool
、object
、str
(和 unicode
) 型別,使用純版本更簡短明瞭,通常是很好的替代方案。對於 float
和 complex
,如果您希望更明確地說明精度,可以使用 float64
和 complex128
。
對於 np.int
,直接替換為 np.int_
或 int
也很好,並且不會改變行為,但精度將繼續取決於電腦和作業系統。如果您想更明確並檢查目前的使用情況,您可以選擇以下替代方案
np.int64
或np.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)
mode
和 searchside
的不精確匹配已被棄用#
早期,mode
和 searchside
的不精確和不區分大小寫的匹配是有效的輸入,現在將給出 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)
outer
和 ufunc.outer
對於矩陣已被棄用#
np.matrix
與 outer
或通用 ufunc 外部呼叫(例如 numpy.add.outer
)一起使用。以前,矩陣在這裡被轉換為陣列。未來將不再這樣做,需要手動轉換為陣列。
(gh-16232)
進一步棄用數值樣式型別#
剩餘的數值樣式型別程式碼 Bytes0
、Str0
、Uint32
、Uint64
和 Datetime64
已被棄用。應改用小寫變體。對於位元組和字串,"S"
和 "U"
是進一步的替代方案。
(gh-16554)
ndindex
的 ndincr
方法已被棄用#
自 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.sctypeNA
和np.typeNA
的棄用已過期。兩者都已從公共 API 中移除。請改用np.typeDict
。(gh-16554)
np.ctypeslib.ctypes_load_library
的 14 年棄用已過期。請改用load_library
,它是相同的。(gh-17116)
財務函式已移除#
根據 NEP 32,財務函式已從 NumPy 1.20 中移除。已移除的函式為 fv
、ipmt
、irr
、mirr
、nper
、npv
、pmt
、ppmt
、pv
和 rate
。這些函式可在 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.sctypeDict
和 np.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->timedelta
和 uint64->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)
mgrid
、r_
等,對於非預設精度的輸入,會一致地返回正確的輸出#
先前,np.mgrid[np.float32(0.1):np.float32(0.35):np.float32(0.1),]
和 np.r_[0:10:np.complex64(3j)]
無法返回有意義的輸出。當使用 dtype 不是預設 float64
和 complex128
以及等效 Python 類型的輸入時,此錯誤可能會影響 mgrid
、ogrid
、r_
和 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.ndarray
和 np.void_
的大小已變更#
PyArrayObject
和 PyVoidScalarObject
結構的大小已變更。以下標頭定義已被移除
#define NPY_SIZEOF_PYARRAYOBJECT (sizeof(PyArrayObject_fields))
因為大小不應被視為編譯時常數:它會隨著 NumPy 的不同運行時版本而改變。
最有可能相關的用途是以 C 語言編寫的潛在子類別,它們將必須重新編譯並且應該更新。有關更多詳細資訊,請參閱 PyArrayObject
的文件,如果您受到此變更的影響,請聯絡 NumPy 開發人員。
NumPy 將嘗試給出優雅的錯誤,但期望固定結構大小的程式可能會有未定義的行為並可能崩潰。
(gh-16938)
新功能#
numpy.all
和 numpy.any
函數的 where
關鍵字參數#
新增了關鍵字參數 where
,它允許在 all
和 any
的布林評估中僅考慮陣列中指定的元素或子軸。這個新關鍵字可透過直接使用 numpy
或在 numpy.ndarray
的方法中使用函數 all
和 any
。
任何可廣播的布林陣列或純量都可以設定為 where
。如果使用者未設定 where
,則預設為 True
,以評估陣列中所有元素的函數。函數的文件中提供了範例。
numpy
函數 mean
、std
、var
的 where
關鍵字參數#
新增了關鍵字參數 where
,它允許將 mean
、std
和 var
的計算範圍限制為僅元素子集。它可透過直接使用 numpy
或在 numpy.ndarray
的方法中使用。
任何可廣播的布林陣列或純量都可以設定為 where
。如果使用者未設定 where
,則預設為 True
,以評估陣列中所有元素的函數。函數的文件中提供了範例。
(gh-15852)
numpy.fft
函數的 norm=backward
、forward
關鍵字選項#
新增了關鍵字參數選項 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)
cov
和 corrcoef
的 dtype
選項#
現在 numpy.cov
和 numpy.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
的支援,以使用關鍵字參數提供輸出 dtype
和 casting
。dtype
參數不能與 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)