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.insert
和 numpy.delete
不再允許在 0 維陣列上傳遞軸 (axis)#
這結束了自 1.9 以來的棄用,在 1.9 版本中,當 axis
參數傳遞給在 0 維陣列上呼叫 ~numpy.insert
和 ~numpy.delete
時,axis
和 obj
參數及索引將被完全忽略。在這些情況下,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.insert
和 numpy.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_end
和 to_begin
的轉換行為#
np.ediff1d
現在對其額外的 to_end
和 to_begin
參數使用 "same_kind"
轉換規則。這確保了類型安全,除非輸入陣列具有比 to_begin
或 to_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 類型,如 int
或 float
)的某些輸入,現在將與傳入 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.integer
、np.generic
或 np.inexact
,現在在轉換為 dtype(或在 dtype 關鍵字參數中使用)時會發出棄用警告。原因是 np.integer
會轉換為 np.int_
,但預期它會表示任何整數(例如,也包括 int8
、int16
等。)。例如,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 dimension
和 strides
作為參數的指標。這表示內部迴圈可能不再修改 dimension
或 strides
。此變更導致 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.copy
的 subok
選項#
一個新的 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_nonzero
的 keepdims
參數#
參數 keepdims
已新增至 numpy.count_nonzero
。此參數具有與縮減函式(例如 numpy.sum
或 numpy.mean
)中相同的含義。
(gh-15870)
numpy.array_equal
的 equal_nan
參數#
關鍵字參數 equal_nan
已新增至 numpy.array_equal
。equal_nan
是一個布林值,用於切換在比較中是否將 nan
值視為相等(預設值為 False
)。這與相關函式(例如 numpy.isclose
和 numpy.allclose
)中使用的 API 相符。
(gh-16128)
改進#
改進 CPU 功能的偵測#
將 npy_cpu_supports
(一種 gcc 特定的機制,用於測試對 AVX 的支援)替換為更通用的函式 npy_cpu_init
和 npy_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.exp
與 np.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.BitGenerator
和 numpy.random.SeedSequence
,_bitgenerator
模組現在作為 numpy.random.bit_generator
公開
透過 pxd
檔案提供 Cython 對隨機分佈的存取#
c_distributions.pxd
提供了對 Cython 中許多隨機分佈背後的 c 函數的存取,使其方便使用和擴展。
(gh-15463)
修正了 numpy.random.multivariate_normal
中的 eigh
和 cholesky
方法#
先前,當傳遞 method='eigh'
或 method='cholesky'
時,numpy.random.multivariate_normal
會從錯誤的分佈產生樣本。現在已修正此問題。
(gh-15872)
修正了 MT19937.jumped
中的跳躍實作#
此修復變更了從跳躍的 MT19937 產生器產生的流。它不影響使用直接播種的 RandomState
或 MT19937
產生的流。
MT19937 跳躍程式碼的翻譯包含反向的迴圈順序。MT19937.jumped
符合松本眞 (Makoto Matsumoto) Horner 和滑動視窗跳躍方法的原始實作。
(gh-16153)