NumPy 1.19.0 發行說明#

此 NumPy 版本以移除大量技術債為標誌:已移除對 Python 2 的支援、許多棄用警告已過期,並且文件已得到改進。隨機模組的潤飾工作持續進行,包含錯誤修復以及來自 Cython 的更佳可用性。

此版本支援的 Python 版本為 3.6-3.8。下游開發者應使用 Cython >= 0.29.16 以支援 Python 3.8,並使用 OpenBLAS >= 3.7 以避免 Skylake 架構上的問題。

重點#

  • Python 和 C 程式碼都已移除與 Python 版本 < 3.6(包括 Python 2)的程式碼相容性。numpy.compat 中的 shim 將保留以支援第三方套件,但它們可能會在未來的版本中被棄用。請注意,由於使用了 f-strings,1.19.x 將無法與早期版本的 Python 編譯。

    (gh-15233)

已過期的棄用警告#

numpy.insertnumpy.delete 不再允許在 0 維陣列上傳遞軸 (axis)#

這結束了自 1.9 以來的棄用,在 1.9 版本中,當 axis 參數傳遞給在 0 維陣列上呼叫 ~numpy.insert~numpy.delete 時,axisobj 參數及索引將被完全忽略。在這些情況下,insert(arr, "nonsense", 42, axis=0) 實際上會覆寫整個陣列,而 delete(arr, "nonsense", axis=0) 將會是 arr.copy()

現在在 0 維陣列上傳遞 axis 會引發 ~numpy.AxisError

(gh-15802)

numpy.delete 不再忽略超出範圍的索引#

這結束了自 1.8 和 1.9 以來的棄用,在 1.8 和 1.9 版本中,np.delete 會忽略索引序列中的負數和超出範圍的項目。這與傳遞單個索引時的行為不一致。

現在超出範圍的項目會拋出 IndexError,而負數項目則從末尾開始索引。

(gh-15804)

numpy.insertnumpy.delete 不再接受非整數索引#

這結束了自 1.9 以來的棄用,在 1.9 版本中,允許使用非整數索引序列並將其轉換為整數。現在傳遞非整數索引序列會引發 IndexError,就像傳遞單個非整數純量時一樣。

(gh-15805)

numpy.delete 不再將布林索引轉換為整數#

這結束了自 1.8 以來的棄用,在 1.8 版本中,np.delete 會將作為索引參數傳遞的布林陣列和純量轉換為整數索引。現在的行為是將布林陣列視為遮罩,並在布林純量上引發錯誤。

(gh-15815)

相容性注意事項#

變更了來自 numpy.random.Generator.dirichlet 的隨機變數串流#

修正了 Dirichlet 分布在 'alpha' 值較小時產生隨機變數的錯誤,方法是在 max(alpha) < 0.1 時使用不同的演算法。由於此變更,在這種情況下由 dirichlet 產生的變數串流將與先前的版本不同。

(gh-14924)

PyArray_ConvertToCommonType 中的純量提升#

PyArray_ConvertToCommonType 中混合純量和陣列的提升已變更為遵循 np.result_type 使用的規則。這表示諸如 (1000, np.array([1], dtype=np.uint8))) 之類的輸入現在將返回 uint16 dtype。在大多數情況下,行為保持不變。請注意,通常不建議使用此 C-API 函式。這也修正了 np.choose 在這方面與 NumPy 的其餘部分表現一致。

(gh-14933)

Fasttake 和 fastputmask 插槽已棄用並設為 NULL#

fasttake 和 fastputmask 插槽現在永遠不會被使用,並且必須始終設為 NULL。這不會導致行為上的任何變更。但是,如果使用者 dtype 應設定其中一個,則會發出 DeprecationWarning。

(gh-14942)

np.ediff1d 使用 to_endto_begin 的轉換行為#

np.ediff1d 現在對其額外的 to_endto_begin 參數使用 "same_kind" 轉換規則。這確保了類型安全,除非輸入陣列具有比 to_beginto_end 更小的整數類型。在極少數情況下,行為會比先前在 1.16 和 1.17 中更嚴格。這對於解決浮點 NaN 的問題是必要的。

(gh-14981)

將空陣列類物件轉換為 NumPy 陣列#

具有 len(obj) == 0 且實作「陣列類」介面的物件,表示實作 obj.__array__()obj.__array_interface__obj.__array_struct__ 或 python 緩衝區介面,並且也是序列(即 Pandas 物件)的物件,現在在轉換為陣列時將始終正確保留其形狀。如果此類物件的形狀先前為 (0, 1),則可能會轉換為形狀為 (0,) 的陣列(遺失第一個 0 之後的所有維度)。

(gh-14995)

已移除 multiarray.int_asbuffer#

作為持續移除 Python 2 相容性的一部分,multiarray.int_asbuffer 已被移除。在 Python 3 上,它會拋出 NotImplementedError 並且在內部未使用。預期在 Python 3 中沒有此方法的下游用例。

(gh-15229)

numpy.distutils.compat 已被移除#

此模組僅包含函式 get_exception(),其使用方式如下

try:
    ...
except Exception:
    e = get_exception()

其目的是處理 Python 2.6 中引入的語法變更,從 except Exception, e: 變更為 except Exception as e:,表示它僅對於支援 Python 2.5 及更舊版本的程式碼庫是必要的。

(gh-15255)

issubdtype 不再將 float 解釋為 np.floating#

自 NumPy 1.14 以來,numpy.issubdtype 有一個 FutureWarning,現在已過期。這表示第二個參數既不是資料類型也不是 NumPy 純量類型(例如字串或 python 類型,如 intfloat)的某些輸入,現在將與傳入 np.dtype(arg2).type 一致。這使得結果與預期一致,並在某些先前返回 true 的情況下導致錯誤的結果。

(gh-15773)

變更純量上 round 的輸出,使其與 Python 一致#

__round__ dunder 方法的輸出,以及隨之而來的 Python 內建 round 已變更為 Python int,以便在不帶參數呼叫時與在 Python float 物件上呼叫它時保持一致。先前,它會返回傳入的 np.dtype 的純量。

(gh-15840)

numpy.ndarray 建構函式不再將 strides=() 解釋為 strides=None#

前者已變更為具有設定 numpy.ndarray.strides() 的預期含義,而後者繼續導致自動選擇 strides。

(gh-15882)

C 級字串到 datetime 的轉換已變更#

簡化了來自字串的 C 級轉換。此變更也修正了字串到 datetime 和 timedelta 的轉換,使其行為正確(即,像使用 string_arr.astype("M8") 的 Python 轉換,而先前的轉換行為類似於 string_arr.astype(np.int_).astype("M8"))。這僅影響使用低階 C-API 執行單個純量值的手動轉換(非完整陣列轉換)或使用例如 PyArray_GetCastFunc 的程式碼,因此不應影響絕大多數使用者。

(gh-16068)

具有小種子的 SeedSequence 不再與衍生衝突#

小種子(小於 2**96)先前會隱式地以 0 填充到 128 位元,即內部熵池的大小。當衍生時,衍生金鑰會在 0 填充之前連接。由於第一個衍生金鑰是 (0,),因此衍生前的小種子會建立與第一個衍生的 SeedSequence 相同的狀態。現在,種子在連接衍生金鑰之前會顯式地以 0 填充到內部池大小。衍生的 SeedSequence 將產生與先前版本不同的結果。未衍生的 SeedSequence 仍將產生相同的結果。

(gh-16551)

棄用#

棄用對於不規則輸入的自動 dtype=object#

根據 NEP 34,呼叫 np.array([[1, [1, 2, 3]]) 將發出 DeprecationWarning。使用者應明確使用 dtype=object 以避免警告。

(gh-15119)

numpy.rec 中的 factory 函式中傳遞 shape=0 已棄用#

0 被視為特殊情況,並在以下函式中別名為 None

  • numpy.core.records.fromarrays

  • numpy.core.records.fromrecords

  • numpy.core.records.fromstring

  • numpy.core.records.fromfile

在未來,0 將不再是特殊情況,並且將被視為與任何其他整數一樣的陣列長度。

(gh-15217)

可能未使用的 C-API 函式的棄用#

以下 C-API 函式可能未使用,並且已被棄用

  • PyArray_GetArrayParamsFromObject

  • PyUFunc_GenericFunction

  • PyUFunc_SetUsesArraysAsData

在大多數情況下,PyArray_GetArrayParamsFromObject 應替換為轉換為陣列,而 PyUFunc_GenericFunction 可以替換為 PyObject_Call(請參閱文件以了解詳細資訊)。

(gh-15427)

將某些類型轉換為 dtype 已棄用#

純量類型的超類別,例如 np.integernp.genericnp.inexact,現在在轉換為 dtype(或在 dtype 關鍵字參數中使用)時會發出棄用警告。原因是 np.integer 會轉換為 np.int_,但預期它會表示任何整數(例如,也包括 int8int16 等。)。例如,dtype=np.floating 目前與 dtype=np.float64 相同,即使 np.float32 也是 np.floating 的子類別。

(gh-15534)

棄用 np.complexfloating 純量的 round#

__round__ dunder 方法的輸出,以及隨之而來的 Python 內建 round 已在複合純量上棄用。這不影響 np.round

(gh-15840)

numpy.ndarray.tostring() 已棄用,建議使用 tobytes()#

~numpy.ndarray.tobytes 自 1.9 版本以來就已存在,但在此版本之前,~numpy.ndarray.tostring 沒有發出任何警告。發出警告的變更使 NumPy 與同名的內建 array.array 方法保持一致。

(gh-15867)

C API 變更#

更佳地支援 API 函式中的 const 維度#

以下函式現在接受 npy_intp 的常數陣列

  • PyArray_BroadcastToShape

  • PyArray_IntTupleFromIntp

  • PyArray_OverflowMultiplyList

先前,呼叫者必須轉換掉 const-ness 才能呼叫這些函式。

(gh-15251)

Const 限定 UFunc 內部迴圈#

UFuncGenericFunction 現在預期指向 const dimensionstrides 作為參數的指標。這表示內部迴圈可能不再修改 dimensionstrides。此變更導致 incompatible-pointer-types 警告,迫使使用者要么忽略編譯器警告,要么 const 限定他們自己的迴圈簽名。

(gh-15355)

新功能#

numpy.frompyfunc 現在接受 identity 參數#

這允許在結果 ufunc 上設定 numpy.ufunc.identity 屬性,表示它可以用於對 numpy.ufunc.reduce 的空呼叫和多維呼叫。

(gh-8255)

np.str_ 純量現在支援緩衝區協議#

np.str_ 陣列始終儲存為 UCS4,因此相應的純量現在透過緩衝區介面公開此資訊,表示 memoryview(np.str_('test')) 現在可以運作。

(gh-15385)

numpy.copysubok 選項#

一個新的 kwarg,subok,已新增至 numpy.copy,以允許使用者切換 numpy.copy 相對於陣列子類別的行為。預設值為 False,這與先前 numpy 版本的 numpy.copy 行為一致。若要建立一個保留陣列子類別的副本,請呼叫 np.copy(arr, subok=True)。此新增更好地說明了 numpy.copy 的預設行為與 numpy.ndarray.copy 方法不同,後者預設會尊重陣列子類別。

(gh-15685)

numpy.linalg.multi_dot 現在接受 out 參數#

out 可用於避免建立 numpy.linalg.multidot 計算的最終產品的不必要副本。

(gh-15715)

numpy.count_nonzerokeepdims 參數#

參數 keepdims 已新增至 numpy.count_nonzero。此參數具有與縮減函式(例如 numpy.sumnumpy.mean)中相同的含義。

(gh-15870)

numpy.array_equalequal_nan 參數#

關鍵字參數 equal_nan 已新增至 numpy.array_equalequal_nan 是一個布林值,用於切換在比較中是否將 nan 值視為相等(預設值為 False)。這與相關函式(例如 numpy.isclosenumpy.allclose)中使用的 API 相符。

(gh-16128)

改進#

改進 CPU 功能的偵測#

npy_cpu_supports(一種 gcc 特定的機制,用於測試對 AVX 的支援)替換為更通用的函式 npy_cpu_initnpy_cpu_have,並透過 NPY_CPU_HAVE c-巨集以及 python 級別的 __cpu_features__ 字典公開結果。

(gh-13421)

在備用 lapack_lite 中,於 64 位元平台上使用 64 位元整數大小#

在備用 LAPACK 函式庫中,於 64 位元平台上使用 64 位元整數大小,當系統未安裝 LAPACK 時會使用備用 LAPACK 函式庫,使其能夠處理大型陣列的線性代數。

(gh-15218)

當輸入為 np.float64 時,使用 AVX512 intrinsic 實作 np.exp#

當輸入為 np.float64 時,使用 AVX512 intrinsic 實作 np.exp,這可以將 np.expnp.float64 輸入的效能提高 5-7 倍。 _multiarray_umath.so 模組在 linux64 上增加了約 63 KB。

(gh-15648)

能夠停用 madvise hugepages#

在 Linux 上,NumPy 先前已新增對 madavise hugepages 的支援,這可以提高非常大的陣列的效能。不幸的是,在較舊的 Kernel 版本上,這導致了效能回退,因此預設情況下,在 4.6 之前的核心版本上已停用此支援。若要覆寫預設值,您可以使用環境變數

NUMPY_MADVISE_HUGEPAGE=0

或將其設定為 1 以強制啟用支援。請注意,僅當作業系統設定為使用 madvise transparent hugepage 時,這才會產生影響。

(gh-15769)

numpy.einsum 接受 subscript 列表中的 NumPy int64 類型#

numpy.einsum 傳遞 NumPy int64 陣列作為其 subscript 列表時,不再拋出類型錯誤。

(gh-16080)

np.logaddexp2.identity 已變更為 -inf#

ufunc ~numpy.logaddexp2 現在具有 -inf 的 identity,使其可以在空序列上呼叫。這與 ~numpy.logaddexp 的 identity 相符。

(gh-16102)

變更#

移除對 __array__ 的額外參數的處理#

自 NumPy 0.4 以來,程式碼路徑和測試一直存在於程式碼中,用於 __array__(dtype=None, context=None) 的雙參數變體。當呼叫 ufunc(op)ufunc.reduce(op)op.__array__ 存在時,它會被啟用。但是,該變體未記錄在文件中,並且不清楚其使用意圖。它已被移除。

(gh-15118)

numpy.random._bit_generator 已移動到 numpy.random.bit_generator#

為了向 Cython 公開 numpy.random.BitGeneratornumpy.random.SeedSequence_bitgenerator 模組現在作為 numpy.random.bit_generator 公開

透過 pxd 檔案提供 Cython 對隨機分佈的存取#

c_distributions.pxd 提供了對 Cython 中許多隨機分佈背後的 c 函數的存取,使其方便使用和擴展。

(gh-15463)

修正了 numpy.random.multivariate_normal 中的 eighcholesky 方法#

先前,當傳遞 method='eigh'method='cholesky' 時,numpy.random.multivariate_normal 會從錯誤的分佈產生樣本。現在已修正此問題。

(gh-15872)

修正了 MT19937.jumped 中的跳躍實作#

此修復變更了從跳躍的 MT19937 產生器產生的流。它不影響使用直接播種的 RandomStateMT19937 產生的流。

MT19937 跳躍程式碼的翻譯包含反向的迴圈順序。MT19937.jumped 符合松本眞 (Makoto Matsumoto) Horner 和滑動視窗跳躍方法的原始實作。

(gh-16153)