NumPy 1.18.0 發行說明#

除了常見的錯誤修正之外,此 NumPy 版本清理並記錄了新的 random C-API,使大量舊的棄用失效,並改善了文件外觀。支援的 Python 版本為 3.5-3.8。這是最後一個支援 Python 3.5 的 NumPy 發行系列。

下游開發者應使用 Cython >= 0.29.14 以支援 Python 3.8,並使用 OpenBLAS >= 3.7 以避免 Skylake 架構上的問題。

重點#

  • 已定義並記錄 numpy.random 的 C-API。

  • 用於連結 64 位元 BLAS 和 LAPACK 函式庫的基本基礎架構。

  • 許多文件改進。

新功能#

多變量超幾何分佈已新增至 numpy.random#

multivariate_hypergeometric 方法已新增至 numpy.random.Generator 類別。此方法從多變量超幾何機率分佈產生隨機變量。 (gh-13794)

棄用#

np.fromfilenp.fromstring 將在資料錯誤時產生錯誤#

在未來的 numpy 版本中,函式 np.fromfilenp.fromstring 在解析錯誤資料時將拋出錯誤。現在這會給出 DeprecationWarning,而先前會靜默地傳回部分甚至無效的資料。此棄用也會影響 C 定義的函式 PyArray_FromStringPyArray_FromFile (gh-13605)

棄用非純量陣列作為 ma.fill_value 中的填充值#

MaskedArray.fill_value 設定為非純量陣列已被棄用,因為將填充值廣播到陣列的邏輯很脆弱,尤其是在切片時。 (gh-13698)

棄用 PyArray_As1DPyArray_As2D#

PyArray_As1DPyArray_As2D 已棄用,請改用 PyArray_AsCArray (gh-14036)

棄用 np.alen#

np.alen 已棄用。請改用 len。 (gh-14181)

棄用財務函數#

根據 NEP-32,財務函數 fv ipmtirrmirrnpernpvpmtppmtpvrate 已棄用,並將從 NumPy 1.20 中移除。這些函數的替代方案是 Python 套件 numpy-financial。 (gh-14720)

numpy.ma.mask_colsnumpy.ma.mask_rowaxis 引數已棄用#

此引數一直被忽略。 (gh-14996)

已過期的棄用#

  • PyArray_As1DPyArray_As2D 已移除,改用 PyArray_AsCArray (gh-14036)

  • np.rank 已移除。此項已在 NumPy 1.10 中棄用,並已由 np.ndim 取代。 (gh-14039)

  • 在 1.13.0 中棄用 expand_dims 超出範圍軸已過期。 (gh-14051)

  • PyArray_FromDimsAndDataAndDescrPyArray_FromDims 已移除(它們將始終引發錯誤)。請改用 PyArray_NewFromDescrPyArray_SimpleNew。 (gh-14100)

  • numeric.loadsnumeric.loadnp.ma.dumpnp.ma.dumpsnp.ma.loadnp.ma.loads 已移除,請改用 pickle 方法 (gh-14256)

  • arrayprint.FloatFormatarrayprint.LongFloatFormat 已移除,請改用 FloatingFormat

  • arrayprint.ComplexFormatarrayprint.LongComplexFormat 已移除,請改用 ComplexFloatingFormat

  • arrayprint.StructureFormat 已移除,請改用 StructureVoidFormat (gh-14259)

  • np.testing.rand 已移除。此項已在 NumPy 1.11 中棄用,並已由 np.random.rand 取代。 (gh-14325)

  • numpy/lib/utils.py 中的類別 SafeEval 已移除。此項已在 NumPy 1.10 中棄用。請改用 np.safe_eval。 (gh-14335)

  • 移除 np.select 中對布林值和空條件清單的已棄用支援 (gh-14583)

  • 陣列順序僅接受 ‘C’、‘F’、‘A’ 和 ‘K’。更寬鬆的選項已在 NumPy 1.11 中棄用。 (gh-14596)

  • np.linspace 參數 num 必須是整數。已在 NumPy 1.12 中棄用。 (gh-14620)

  • 具有多個輸出的 UFuncs 必須使用元組作為 out kwarg。這完成了從 NumPy 1.10 開始的棄用。 (gh-14682)

檔案 numpy/testing/decorators.pynumpy/testing/noseclasses.pynumpy/testing/nosetester.py 已移除。它們從未打算公開(所有相關物件都存在於 numpy.testing 命名空間中),並且自 NumPy 1.15.0 以來,匯入它們會發出棄用警告 (gh-14567)

相容性注意事項#

numpy.lib.recfunctions.drop_fields 不再傳回 None#

如果 drop_fields 用於捨棄所有欄位,則先前會完全捨棄陣列並傳回 None。現在它會傳回與輸入形狀相同的陣列,但沒有欄位。可以使用以下方式保留舊行為

dropped_arr = drop_fields(arr, ['a', 'b'])
if dropped_arr.dtype.names == ():
    dropped_arr = None

將空記錄陣列轉換為 None (gh-14510)

numpy.argmin/argmax/min/max 如果陣列中存在 NaT,則傳回 NaT#

numpy.argminnumpy.argmaxnumpy.minnumpy.max 如果 NaT 存在於陣列中,則會傳回 NaT。 (gh-14717)

np.can_cast(np.uint64, np.timedelta64, casting='safe') 現在為 False#

先前這是 True - 然而,這與 uint64 無法安全地轉換為 int64 不一致,並導致奇怪的類型解析。

如果這影響到您的程式碼,請先將 uint64 轉換為 int64。 (gh-14718)

變更了來自 numpy.random.Generator.integers 的隨機變量流#

numpy.random.Generator.integers 中存在一個錯誤,導致對 8 位元和 16 位元整數類型進行有偏差的採樣。修復該錯誤已變更了輸出流,使其與先前版本不同。 (gh-14777)

datetime64timedelta64 新增更多 ufunc 迴圈#

np.datetime('NaT') 的行為應更像 float('Nan')。新增所需的基礎架構,以便 np.isinf(a)np.isnan(a) 將在 datetime64timedelta64 dtype 上執行。也為 numpy.fminnumpy.fmax 新增了遮罩 NaT 的特定迴圈。這可能需要調整面向使用者的程式碼。具體來說,不允許呼叫 numpy.isinfnumpy.isnan 或檢查它們是否引發異常的程式碼將需要調整,而錯誤地呼叫 numpy.fmaxnumpy.fmin 而不是 numpy.maximumnumpy.minimum 的程式碼將需要調整。這也會影響 numpy.nanmaxnumpy.nanmin。 (gh-14841)

移動了 numpy.random 中的模組#

作為 API 清理的一部分,numpy.random 中的子模組 bit_generatorphiloxpcg64sfc64, ``commongeneratorbounded_integers 已分別移動到 _bit_generator_philox_pcg64_sfc64, ``_common_generator_bounded_integers,以表明它們不是公共介面的一部分。 (gh-14608)

C API 變更#

PyDataType_ISUNSIZED(descr) 現在針對結構化資料類型傳回 False#

先前,這對於項目大小為 0 的任何資料類型都傳回 True,但現在這對於項目大小為 0 的非彈性資料類型 np.dtype([]) 傳回 false。 (gh-14393)

新功能#

新增我們自己的 *.pxd cython 匯入檔案#

新增了 numpy/__init__.pxd 檔案。它將用於 cimport numpy (gh-12284)

軸元組現在可以輸入到 expand_dims#

numpy.expand_dims axis 關鍵字現在可以接受軸元組。先前,axis 必須是整數。 (gh-14051)

支援 64 位元 OpenBLAS#

新增了對 64 位元 (ILP64) OpenBLAS 的支援。請參閱 site.cfg.example 以瞭解詳細資訊。 (gh-15012)

為 F2PY 新增 --f2cmap 選項#

允許指定檔案以從中載入 Fortran-to-C 類型對應自訂項目。 (gh-15113)

改進#

相同大小的不同 C 數字類型具有唯一名稱#

在任何給定平台上,np.intcnp.int_np.longlong 中的兩個先前會透過其 repr 顯示為無法區分,儘管它們對應的 dtype 具有不同的屬性。np.doublenp.longdouble 的無符號對應項以及某些平台也存在類似的問題

這些類型現在始終使用唯一的 __name__ 列印。 (gh-10151)

argwhere 現在在 0d 陣列上產生一致的結果#

在 N 維陣列上,numpy.argwhere 現在始終產生形狀為 (n_non_zero, arr.ndim) 的陣列,即使 arr.ndim == 0 也是如此。先前,在這種情況下,最後一個軸的維度將為 1。 (gh-13610)

random.permutationrandom.shuffle 新增 axis 引數#

先前,random.permutationrandom.shuffle 函數只能沿第一個軸隨機排序陣列;它們現在有一個新的引數 axis,允許沿指定的軸隨機排序。 (gh-13829)

np.random.multivariate_normalmethod 關鍵字引數#

現在 np.random.multivariate_normal 提供 method 關鍵字引數,其可能值為 {'svd', 'eigh', 'cholesky'}。若要使用它,請寫入 np.random.multivariate_normal(..., method=<method>)。 (gh-14197)

numpy.fromstring 新增複數支援#

現在 numpy.fromstring 可以讀取複數。 (gh-14227)

axis 不是 None 時,numpy.unique 具有一致的軸順序#

numpy.unique 中使用 moveaxis 而不是 swapaxes,以便除了引數中的軸之外的軸的順序不會被打斷。 (gh-14255)

具有布林值輸出的 numpy.matmul 現在轉換為布林值#

呼叫 numpy.matmul,其中輸出是布林值陣列,會以 uint8 等效值(而不是 0/1)填充陣列。現在它強制輸出為 0 或 1(NPY_TRUENPY_FALSE)。 (gh-14464)

當範圍為 2**32 時,numpy.random.randint 產生不正確的值#

在 1.17.0 中引入的實作在判斷是否使用 32 位元路徑或完整 64 位元路徑時,具有不正確的檢查,該檢查錯誤地將高低範圍為 2**32 的隨機整數產生重新導向到 64 位元產生器。 (gh-14501)

numpy.fromfile 新增複數支援#

現在 numpy.fromfile 可以讀取複數。 (gh-14730)

如果編譯器名為 gcc,則新增 std=c99#

版本 5 之前的 GCC 需要 -std=c99 命令列引數。較新的編譯器會自動開啟 C99 模式。如果編譯器名稱中包含 gcc,則編譯器設定程式碼會自動新增程式碼。 (gh-14771)

變更#

NaT 現在排序到陣列的末尾#

現在 NaT 在排序時被有效地視為最大的整數,因此它會排序到陣列的末尾。此變更是為了與 NaN 排序行為保持一致。 (gh-12658) (gh-15068)

np.set_printoptions 中不正確的 threshold 引發 TypeErrorValueError#

先前,不正確的 threshold 引發 ValueError;現在它針對非數字類型引發 TypeError,針對 nan 值引發 ValueError。 (gh-13899)

在儲存具有中繼資料的 dtype 時發出警告#

當透過 numpy.save 儲存具有 metadata 的陣列時,將發出 UserWarningmetadata 可能無法保留儲存此類陣列,如果保留了中繼資料,則載入它將導致 ValueError。儲存和載入中的此缺點將在未來版本中解決。 (gh-14142)

numpy.distutils 附加行為已針對 LDFLAGS 和類似項目變更#

numpy.distutils 始終覆寫而不是附加到 LDFLAGS 和其他類似的環境變數,以用於編譯 Fortran 擴充功能。現在,預設行為已變更為附加 - 這是在大多數情況下預期的行為。若要保留舊的(覆寫)行為,請將 NPY_DISTUTILS_APPEND_FLAGS 環境變數設定為 0。這適用於:LDFLAGSF77FLAGSF90FLAGSFREEFLAGSFOPTFDEBUGFFLAGS。NumPy 1.16 和 1.17 在行為變更會影響所用編譯旗標的情況下發出了建置警告。 (gh-14248)

移除 numpy.random.entropy,而沒有棄用#

numpy.random.entropy 已在 1.17.0 中新增至 numpy.random 命名空間。它原本應該是一個私有的 c 擴充模組,但被公開了。它已被 numpy.random.SeedSequence 取代,因此該模組已完全移除。 (gh-14498)

新增選項以安靜建置配置並使用 -Werror 進行建置#

新增了兩個新的配置選項。在 build_src 子命令執行期間,作為配置 NumPy 的一部分,會透過探測對各種執行時期函數和常式的支援,來建立 _numpyconfig.hconfig.h 檔案。先前,在此階段非常冗長的編譯器輸出,會使更重要的資訊變得模糊不清。預設情況下,輸出會被靜音。執行 runtests.py --debug-info 將會把 --verbose-cfg 加入到 build_src 子命令,這將恢復先前的行為。

新增 CFLAGS=-Werror 以將警告轉換為錯誤,會在配置期間觸發錯誤。現在,runtests.py --warn-error 將會把 --warn-error 加入到 build 子命令,這將會滲透到 build_extbuild_lib 子命令。這將會把編譯器旗標加入到這些階段,並在實際建置 NumPy 本身時,將編譯器警告轉換為錯誤,從而避免 build_src 子命令的編譯器呼叫。

(gh-14527) (gh-14518)