NumPy 1.16.0 發行說明#

此 NumPy 版本是最後一個支援 Python 2.7 的版本,並且將作為長期發行版本維護,直到 2020 年修復錯誤。已移除對 Python 3.4 的支援,支援的 Python 版本為 2.7 和 3.5-3.7。PyPI 上的 wheels 連結至 OpenBLAS v0.3.4+,這應修正先前 OpenBLAS 版本中發現的已知執行緒問題。

建置此發行版本的下游開發者應使用 Cython >= 0.29,如果使用 OpenBLAS,則應使用 OpenBLAS > v0.3.4。

此版本進行了大量重構,並包含許多錯誤修正、改進的程式碼組織和更佳的跨平台相容性。並非所有這些改進對使用者都是可見的,但它們應有助於簡化未來的維護工作。

重點#

  • 實驗性(僅限選擇加入)支援覆寫 numpy 函數,請參閱下方的 __array_function__

  • matmul 函數現在是一個 ufunc。這提供更佳的效能,並允許使用 __array_ufunc__ 覆寫。

  • 改進對 ARM 和 POWER 架構的支援。

  • 改進對 AIX 和 PyPy 的支援。

  • 改進與 ctypes 的互通性。

  • 改進對 PEP 3118 的支援。

新函數#

  • 新增函數至 numpy.lib.recfuntions 模組,以簡化結構化賦值變更

    • assign_fields_by_name

    • structured_to_unstructured

    • unstructured_to_structured

    • apply_along_fields

    • require_fields

    請參閱使用者指南 <https://scipy-docs.dev.org.tw/doc/numpy/user/basics.rec.html> 以取得更多資訊。

新的棄用#

  • 類型字典 numpy.core.typeNAnumpy.core.sctypeNA 已棄用。它們有錯誤且未記載,將在 1.18 版本中移除。請改用 numpy.sctypeDict

  • numpy.asscalar 函數已棄用。它是功能更強大的 numpy.ndarray.item 的別名,未經測試,且對於純量會失敗。

  • numpy.set_array_opsnumpy.get_array_ops 函數已棄用。作為 NEP 15 的一部分,它們已與 C-API 函數 PyArray_SetNumericOpsPyArray_GetNumericOps 一起棄用。希望覆寫內建 ufunc 中內部迴圈函數的使用者應使用 PyUFunc_ReplaceLoopBySignature

  • numpy.unravel_index 關鍵字引數 dims 已棄用,請改用 shape

  • numpy.histogram normed 引數已棄用。先前已棄用,但未發出警告。

  • 套用至非數值陣列的 positive 運算子 (+) 已棄用。請參閱下方以取得詳細資訊。

  • 將迭代器傳遞至堆疊函數已棄用

過期的棄用#

  • NaT 比較現在傳回 False 而不發出警告,完成在 NumPy 1.11 中開始的棄用週期。

  • np.lib.function_base.unique 已移除,完成在 NumPy 1.4 中開始的棄用週期。請改用 numpy.unique

  • 多欄位索引現在傳回檢視而非副本,完成在 NumPy 1.7 中開始的棄用週期。此變更先前已在 NumPy 1.14 中嘗試過,但已還原,直到現在。

  • np.PackageLoadernp.pkgload 已移除。這些在 1.10 中已棄用,沒有測試,且在 1.15 中似乎不再運作。

未來變更#

  • NumPy 1.17 將停止支援 Python 2.7。

相容性注意事項#

Windows 上的 f2py 腳本#

在 Windows 上,用於執行 f2py 的已安裝腳本現在是一個 .exe 檔案,而不是 *.py 檔案,並且當 Scripts 目錄在路徑中時,應從命令列以 f2py 執行。在任何 NumPy 版本中,將 f2py 作為模組 python -m numpy.f2py [...] 執行,無需修改路徑即可運作。

NaT 比較#

與 NaN 的行為一致,除了與 datetime64 或 timedelta64 NaT(「非時間」)值的不等式檢查之外,所有比較現在都始終傳回 False,而與 NaT 的不等式檢查現在始終傳回 True。這包括 NaT 值之間的比較。為了與舊行為相容,請使用 np.isnat 明確檢查 NaT,或在使用 .astype(np.int64) 進行比較之前,轉換 datetime64/timedelta64 陣列。

complex64/128 對齊方式已變更#

複數類型的記憶體對齊方式現在與由兩個浮點數值組成的 C 結構相同,而之前它等於類型的大小。對於許多使用者(例如在 x64/unix/gcc 上),這表示 complex64 現在是 4 位元組對齊,而不是 8 位元組對齊。一個重要的後果是,對齊的結構化 dtype 現在可能具有不同的大小。例如,np.dtype('c8,u1', align=True) 過去具有 16 的 itemsize(在 x64/gcc 上),但現在為 12。

更詳細地說,complex64 類型現在具有與 C 結構 struct {float r, i;} 相同的對齊方式,根據用於編譯 numpy 的編譯器,complex128 和 complex256 類型也是如此。

nd_grid __len__ 移除#

len(np.mgrid)len(np.ogrid) 現在被認為是無意義的,並引發 TypeError

np.unravel_index 現在接受 shape 關鍵字引數#

先前,只有 dims 關鍵字引數被接受用於指定要用於解開的陣列的形狀。dims 仍然受到支援,但現在已棄用。

多欄位檢視傳回檢視而非副本#

使用多個欄位索引結構化陣列,例如 arr[['f1', 'f3']],會傳回原始陣列的檢視,而不是副本。與之前不同,傳回的檢視通常會具有與原始陣列中介入場地對應的額外填充位元組,這會影響諸如 arr[['f1', 'f3']].view('float64') 之類的程式碼。此變更自 numpy 1.7 以來已規劃。自那時起,命中此路徑的操作已發出 FutureWarnings。在 1.12 中新增了關於此變更的額外 FutureWarnings

為了協助使用者更新其程式碼以考慮這些變更,已將許多函數新增至 numpy.lib.recfunctions 模組,這些函數安全地允許此類操作。例如,上述程式碼可以用 structured_to_unstructured(arr[['f1', 'f3']], dtype='float64') 取代。請參閱 使用者指南的「存取多個欄位」章節。

C API 變更#

NPY_FEATURE_VERSION 已遞增至 0x0000D,由於新增了

新功能#

整合平方誤差 (ISE) 估計器新增至 histogram#

此方法 (bins='stone') 用於最佳化 bin 數量是 Scott 規則的推廣。Scott 規則假設分佈近似於常態分佈,而 ISE 是一種基於交叉驗證的非參數方法。

np.loadtxt 新增 max_rows 關鍵字#

numpy.loadtxt 中的新關鍵字 max_rows 設定在 skiprows 之後要讀取的內容的最大列數,如同 numpy.genfromtxt 中一樣。

np.timedelta64 運算元新增模數運算子支援#

現在支援類型為 np.timedelta64 的兩個運算元的模數(餘數)運算子。運算元可能具有不同的單位,且傳回值將符合運算元的類型。

改進#

numpy 陣列的無副本 pickling#

在協定 4 之前,numpy 陣列 pickling 會建立要序列化的資料的 2 個虛假副本。使用 pickle 協定 5 和 PickleBuffer API,現在可以序列化各種 numpy 陣列,而無需使用帶外緩衝區進行任何副本,並使用帶內緩衝區減少一個副本。對於大型陣列,這會導致峰值記憶體使用量最多減少 66%。

建置 shell 獨立性#

NumPy 建置應不再直接與主機 shell 互動。exec_command 已在適當情況下替換為 subprocess.check_output

np.polynomial.Polynomial 類別在 Jupyter notebook 中以 LaTeX 呈現#

當在支援它的前端中使用時,Polynomial 實例現在透過 LaTeX 呈現。目前的格式是實驗性的,並且可能會變更。

randintchoice 現在適用於空分佈#

即使不需要繪製任何元素,當引數描述空分佈時,np.random.randintnp.random.choice 也會引發錯誤。這已修正,例如 np.random.choice([], 0) == np.array([], dtype=float64)

linalg.lstsqlinalg.qrlinalg.svd 現在適用於空陣列#

先前,當傳入空矩陣/空矩陣(具有零列和/或欄)時,會引發 LinAlgError。現在會傳回適當形狀的輸出。

鏈結例外以針對無效的 PEP3118 格式字串提供更佳的錯誤訊息#

這應有助於追蹤問題。

Einsum 最佳化路徑更新和效率改進#

Einsum 已與目前的上游工作同步。

numpy.anglenumpy.expand_dims 現在適用於 ndarray 子類別#

特別是,它們現在適用於遮罩陣列。

NPY_NO_DEPRECATED_API 編譯器警告抑制#

NPY_NO_DEPRECATED_API 設定為值 0 將在使用已棄用的 numpy API 時,抑制目前的編譯器警告。

np.diff 新增 kwargs prepend 和 append#

新的 kwargs prependappend,允許在差異的任一端插入值。類似於 ediff1d 的選項。現在可以透過 prepend=0 輕鬆取得 cumsum 的反向。

ARM 支援已更新#

ARM CPU 的支援已更新,以容納 32 位元和 64 位元目標,以及大端和小端位元組順序。AARCH32 記憶體對齊問題已解決。CI 測試已擴展,以透過 shippable.com 的服務包含 AARCH64 目標。

附加至建置旗標#

numpy.distutils 始終覆寫而不是附加到 LDFLAGS 和其他類似的環境變數,以編譯 Fortran 擴充功能。現在,如果 NPY_DISTUTILS_APPEND_FLAGS 環境變數設定為 1,則行為將是附加。這適用於:LDFLAGSF77FLAGSF90FLAGSFREEFLAGSFOPTFDEBUGFFLAGS。請參閱 gh-11525 以取得更多詳細資訊。

廣義 ufunc 簽名現在允許固定大小的維度#

透過在廣義 ufunc 的簽名中使用數值,可以指示給定函數要求輸入或輸出具有給定大小的維度。例如,將極角轉換為二維笛卡爾單位向量的函數的簽名將為 ()->(2);將兩個球面角轉換為三維單位向量的函數的簽名將為 (),()->(3);而兩個三維向量的叉積的簽名將為 (3),(3)->(3)

請注意,對於基本函數,這些維度與以字母開頭的名稱表示的可變維度沒有不同的處理方式;迴圈仍然會傳遞相應的大小,但現在可以依賴該大小等於簽名中給定的固定大小。

廣義 ufunc 簽名現在允許彈性維度#

某些函數,特別是 numpy 的 @ 作為 matmul 的實作,與廣義 ufunc 非常相似,因為它們在核心維度上運作,但人們無法將它們呈現為廣義 ufunc,因為它們能夠處理缺少維度的輸入。為了支援這一點,現在允許在維度名稱後綴問號,以指示該維度不一定必須存在。

透過此新增功能,matmul 的簽名可以表示為 (m?,n),(n,p?)->(m?,p?)。這表示,例如,如果第二個運算元只有一個維度,則為了基本函數的目的,它將被視為具有核心形狀 (n, 1) 的輸入,並且輸出具有 (m, 1) 的對應核心形狀。然而,實際輸出陣列會移除彈性維度,即它將具有形狀 (..., m)。同樣地,如果兩個引數都只有一個維度,則輸入將呈現為具有形狀 (1, n)(n, 1) 給基本函數,而輸出為 (1, 1),而傳回的實際輸出陣列將具有形狀 ()。透過這種方式,簽名允許將單個基本函數用於四個相關但不同的簽名,(m,n),(n,p)->(m,p)(n),(n,p)->(p)(m,n),(n)->(m)(n),(n)->()

np.clipclip 方法檢查記憶體重疊#

現在始終測試這些函數的 out 引數是否存在記憶體重疊,以避免在發生記憶體重疊時結果損壞。

np.polyfit 中選項 cov 的新值 unscaled#

已將另一個可能的值新增至 np.polyfit 函數的 cov 參數。使用 cov='unscaled',完全停用共變異數矩陣的縮放(類似於在 scipy.optimize.curve_fit 中設定 absolute_sigma=True)。這在權重由 1/sigma 給出且 sigma 是(已知)高斯分佈資料點的標準誤差的情況下非常有用,在這種情況下,未縮放的矩陣已經是對共變異數矩陣的正確估計。

純量數值類型的詳細文件字串#

當應用於諸如 numpy.intcnumpy.int_numpy.longlong 之類的數值類型時,help 函數現在列出該類型的所有別名,區分平台相關和平台獨立的別名。

__module__ 屬性現在指向公用模組#

大多數 NumPy 函數上的 __module__ 屬性已更新為參考從中存取函數的首選公用模組,而不是函數恰好定義所在的模組。這為 IPython 等工具中的函數產生更豐富的資訊顯示,例如,您現在看到 <function 'numpy.sum'> 而不是 <function 'numpy.core.fromnumeric.sum'>

大型分配標記為適用於透明巨頁#

在支援透過 madvise 系統呼叫的透明巨頁的系統上,numpy 現在標記大型記憶體分配可以由巨頁支援,這減少了頁面錯誤開銷,並且在某些錯誤繁重的情況下可以顯著提高效能。在 Linux 上,要使用的巨頁設定 /sys/kernel/mm/transparent_hugepage/enabled 必須至少為 madvise。已經設定為 always 的系統不會看到太大差異,因為核心會自動在適當的地方使用巨頁。

非常舊的 Linux 核心(~3.x 及更舊版本)的使用者應確保 /sys/kernel/mm/transparent_hugepage/defrag 未設定為 always,以避免記憶體碎片整理中的並行問題導致效能問題。

Alpine Linux(和其他 musl c 程式庫發行版)支援#

我們現在預設使用 fenv.h 進行浮點狀態錯誤報告。先前我們有一個損壞的預設值,有時不會報告下溢、溢位和無效的浮點運算。現在我們可以支援非 glibc 發行版,例如 Alpine Linux,只要它們隨附 fenv.h

加速大型陣列的 np.block#

大型陣列(大於 512 * 512)現在使用基於將資料直接複製到結果陣列的適當切片的區塊演算法。這為這些大型陣列帶來顯著的加速,特別是對於沿著 2 個以上維度區塊化的陣列。

arr.ctypes.data_as(...) 保留對 arr 的參考#

先前,呼叫者負責在指標的生命週期內保持陣列存活。

加速唯讀陣列的 np.take#

np.take 的實作在其 writeable 旗標設定為 False 時,不再對來源陣列進行不必要的複製。

支援更多函數的路徑類物件#

np.core.records.fromfile 函數現在除了檔案物件之外,還支援 pathlib.Path 和其他路徑類物件。此外,當使用記憶體對應(mmap_mode 關鍵字引數)時,np.load 函數現在也支援路徑類物件。

ufunc 恆等式在縮減期間的更佳行為#

通用函數具有 .identity,當在空軸上呼叫 .reduce 時使用。

在此版本中,邏輯二元 ufunc、logical_andlogical_orlogical_xor 現在具有 bool 類型的 identity,而先前它們是 int 類型。這還原了使用這些 ufunc 縮減空物件陣列時取得 bool 的 1.14 行為,同時也保留了使用諸如 addmultiply 之類的算術 ufunc 縮減空物件陣列時取得 int 的 1.15 行為。

此外,logaddexp 現在具有 -inf 的恆等式,使其可以在空序列上呼叫,而先前無法呼叫。

這要歸功於新的 PyUFunc_FromFuncAndDataAndSignatureAndIdentity,它允許現在將任意值用作恆等式。

改進從 ctypes 物件的轉換#

Numpy 始終支援從 ctypes 取得值或類型並將其轉換為陣列或 dtype,但僅對於較簡單的類型表現正確。自此版本起,此警告已解除 - 現在

  • 尊重 ctypes.Structure_pack_ 屬性,用於模擬 C 的 __attribute__((packed))

  • 保留所有 ctypes 物件的位元組順序

  • 支援 ctypes.Union

  • 不可表示的建構引發例外,而不是產生危險地不正確的結果

    • 位元欄位不再解釋為子陣列

    • 指標不再替換為它們指向的類型

新的 ndpointer.contents 成員#

這與一般 ctypes 陣列的 .contents 成員相符,可用於圍繞指標內容建構 np.array。這取代了在 1.15 中停止運作的 np.array(some_nd_pointer)。作為此變更的副作用,ndpointer 現在支援具有重疊欄位和填充的 dtype。

matmul 現在是 ufunc#

numpy.matmul 現在是一個 ufunc,這表示函數和 __matmul__ 運算子現在都可以被 __array_ufunc__ 覆寫。它的實作也已變更。它使用與 numpy.dot 相同的 BLAS 常式,確保其效能對於大型矩陣而言是相似的。

linspacelogspacegeomspace 的 start 和 stop 陣列#

這些函數過去僅限於純量 stop 和 start 值,但現在可以採用陣列,這些陣列將被正確廣播,並產生一個預先新增一個軸的輸出。這可以用於例如取得點集之間線性內插的點。

CI 已擴展其他服務#

我們現在使用額外的免費 CI 服務,感謝以下公司提供

  • 透過 codecov.io 進行程式碼覆蓋率測試

  • 透過 shippable.com 進行 Arm 架構測試

  • 在 Azure Pipelines 上進行額外的測試執行

這些服務是除了我們持續使用的 Travis、Appveyor (用於 wheels) 和 LGTM 之外的額外資源

變更#

比較 ufuncs 現在會拋出錯誤,而不是回傳 NotImplemented#

過去,如果比較 ufuncs (例如 np.equal) 的參數具有結構化 dtype,它們會回傳 NotImplemented,以協助比較運算子 (例如 __eq__) 處理這些情況。由於相關邏輯已移至比較運算子本身 (因此比較運算子在需要時仍會繼續回傳 NotImplemented),因此不再需要這樣做。因此,與所有其他 ufuncs 一樣,比較 ufuncs 現在會在結構化 dtype 上拋出錯誤。

Positive 現在會針對非數值陣列引發棄用警告#

過去,+array 會無條件回傳一個副本。現在,如果陣列不是數值型 (亦即,如果 np.positive(array) 引發 TypeError),則會引發 DeprecationWarning。對於覆寫預設 __array_ufunc__ 實作的 ndarray 子類別,TypeError 會被傳遞下去。

NDArrayOperatorsMixin 現在實作矩陣乘法#

過去,np.lib.mixins.NDArrayOperatorsMixin 沒有實作 Python 矩陣乘法運算子 (@) 的特殊方法。現在 matmul 是一個 ufunc,並且可以使用 __array_ufunc__ 覆寫,因此情況已改變。

np.polyfit 中共變異數矩陣的縮放已變更#

到目前為止,np.polyfit 在共變異數矩陣的縮放中使用了非標準因子。也就是說,它沒有使用標準的 chisq/(M-N),而是使用 chisq/(M-N-2) 進行縮放,其中 M 是資料點的數量,N 是參數的數量。這種縮放與其他擬合程式 (例如 scipy.optimize.curve_fit) 不一致,因此已變更為 chisq/(M-N)

maximumminimum 不再發出警告#

作為 1.10 版本中引入的程式碼的一部分,當在使用 SSE2 語義時,在 numpy.maximumnumpy.minimum 中遇到 Nan 時,float32float64 會設定無效的浮點數狀態。這導致有時會發出 RuntimeWarning。在 1.15 版本中,我們修正了導致警告變得更加明顯的不一致之處。現在將不再發出警告。

Umath 和 multiarray c 擴充模組合併為單一模組#

根據 NEP 15,這兩個模組已合併。先前,np.core.umathnp.core.multiarray 是獨立的 c 擴充模組。現在它們是單一 np.core/_multiarray_math c 擴充模組的 Python 封裝器。

getfield 有效性檢查已擴展#

numpy.ndarray.getfield 現在會檢查 dtype 和 offset 參數,以防止存取無效的記憶體位置。

NumPy 函數現在支援使用 __array_function__ 進行覆寫#

NumPy 具有一個新的實驗性機制,可以透過定義 __array_function__ 方法來覆寫幾乎所有 NumPy 函數在非 NumPy 陣列上的實作,如 NEP 18 中所述。

此功能尚未預設啟用,但已發布以方便潛在使用者進行實驗。有關設定適當環境變數的詳細資訊,請參閱 NEP。我們預期 NumPy 1.17 版本將預設啟用覆寫,由於使用 C 語言編寫的新實作,效能也會更高。

基於唯讀緩衝區的陣列無法設定為 writeable#

我們現在禁止將從 fromstring(readonly-buffer) 建立的陣列的 writeable 標誌設定為 True。