NumPy 1.4.0 發行說明#

這個小版本包含大量的錯誤修正,以及一些新功能。它與 1.3.0 版本向後相容。

重點#

  • 新的 datetime dtype 支援以處理陣列中的日期

  • 更快的匯入時間

  • 擴展的陣列包裝機制用於 ufuncs

  • 新的鄰域迭代器(僅限 C 級)

  • npymath 中類似 C99 的複數函數

新功能#

擴展的陣列包裝機制用於 ufuncs#

ndarray 新增了一個 __array_prepare__ 方法,為子類別提供更大的彈性來與 ufuncs 和類似 ufunc 的函數互動。ndarray 已經提供了 __array_wrap__,它允許子類別為結果設定陣列類型,並在 ufunc 輸出時填充元資料(如 MaskedArray 的實作中所見)。對於某些應用程式,有必要在輸入時提供檢查和填充元資料。因此,__array_prepare__ 在 ufunc 初始化輸出陣列之後但在計算結果並填充它之前被呼叫。這樣,就可以在可能就地修改資料的操作之前進行檢查並引發錯誤。

自動偵測向前不相容性#

先前,如果擴充功能是針對 NumPy 版本 N 建置的,並在 NumPy M < N 的系統上使用,則 import_array 會成功,這可能會導致崩潰,因為版本 M 沒有版本 N 中的函數。從 NumPy 1.4.0 開始,這將導致 import_array 失敗,因此錯誤將會在早期被捕獲。

新的迭代器#

C API 中新增了一個新的鄰域迭代器。它可以用於迭代陣列鄰域中的項目,並且可以自動處理邊界條件。可以使用零和一填充,以及任意常數值、鏡像和循環填充。

新的多項式支援#

新增了 chebyshev 和 polynomial 模組。新的 polynomial 模組與 numpy 中目前的多項式支援不相容,但與新的 chebyshev 模組非常相似。對大多數人來說,最明顯的區別將是係數是從低次冪到高次冪指定的,低階函數不適用於 Chebyshev 和 Polynomial 類別作為參數,並且 Chebyshev 和 Polynomial 類別包含一個域。域之間的映射是線性替換,這兩個類別可以相互轉換,例如,允許將一個域中的 Chebyshev 級數展開為另一個域中的多項式。新的類別通常應該用來代替低階函數,後者提供給那些希望建立自己類別的人。

新的模組不會自動匯入 numpy 命名空間,必須使用「import numpy.polynomial」語句顯式導入。

新的 C API#

以下 C 函數已新增至 C API

  1. PyArray_GetNDArrayCFeatureVersion:傳回已載入 numpy 的 API 版本。

  2. PyArray_Correlate2 - 類似於 PyArray_Correlate,但實作了相關性的常用定義。輸入不會交換,並且對複數陣列取共軛。

  3. PyArray_NeighborhoodIterNew - 一個新的迭代器,用於迭代點的鄰域,並具有自動邊界處理功能。它記錄在 C-API 參考的迭代器章節中,您可以在 numpy.core 中的 multiarray_test.c.src 檔案中找到一些範例。

新的 ufuncs#

以下 ufuncs 已新增至 C API

  1. copysign - 傳回第一個參數的值,其符號從第二個參數複製。

  2. nextafter - 傳回第一個參數朝向第二個參數的下一個可表示浮點數值。

新的定義#

alpha 處理器現在已定義並在 numpy/npy_cpu.h 中可用。PARISC 處理器的偵測失敗問題已修正。定義如下

  1. NPY_CPU_HPPA:PARISC

  2. NPY_CPU_ALPHA:Alpha

測試#

  1. deprecated 裝飾器:此裝飾器可用於避免在測試輸出中產生混亂,同時測試 DeprecationWarning 由裝飾的測試有效地引發。

  2. assert_array_almost_equal_nulp:比較兩個浮點數值陣列的新方法。使用此函數,如果兩個值之間沒有太多可表示的浮點數值,則認為這兩個值接近,因此在值波動很大時,比 assert_array_almost_equal 更穩健。

  3. assert_array_max_ulp:如果兩個浮點數值之間的可表示數字超過 N 個,則引發斷言。

  4. assert_warns:如果可調用物件未產生適當類別的警告,則引發 AssertionError,且不改變警告狀態。

重新使用 npymath#

在 1.3.0 中,我們開始將可攜式 C 數學常式放入 npymath 函式庫中,以便人們可以使用它們來編寫可攜式擴充功能。不幸的是,無法輕鬆地連結到此函式庫:在 1.4.0 中,numpy.distutils 中新增了支援,以便第三方可以重複使用此函式庫。請參閱 coremath 文件以取得更多資訊。

改進的集合運算#

在先前版本的 NumPy 中,如果輸入陣列包含重複項目,某些集合函數(intersect1d、setxor1d、setdiff1d 和 setmember1d)可能會傳回不正確的結果。這些函數現在可以正確處理包含重複項目的輸入陣列。setmember1d 已重新命名為 in1d,因為隨著接受包含重複項目的陣列的變更,它不再是集合運算,並且在概念上類似於 Python 運算子「in」的元素版本。所有這些函數現在都接受布林關鍵字 assume_unique。預設值為 False,但如果已知輸入陣列不包含重複項目,則可以將其設定為 True,這可以提高函數的執行速度。

改善#

  1. NumPy 匯入速度明顯更快(取決於平台和電腦,從 20% 到 30%)。

  2. 排序函數現在將 nans 排序到最後。

    • 實數排序順序為 [R, nan]。

    • 複數排序順序為 [R + Rj, R + nanj, nan + Rj, nan + nanj]。

    具有相同 nan 位置的複數會根據非 nan 部分(如果存在)進行排序。

  3. 類型比較函數已與新的 nans 排序順序保持一致。Searchsorted 現在適用於包含 nan 值的已排序陣列。

  4. 複數除法已變得更耐溢位。

  5. 複數 floor 除法已變得更耐溢位。

棄用#

以下函數已棄用

  1. correlate:它採用新的關鍵字引數 old_behavior。當為 True(預設值)時,它會傳回與之前相同的結果。當為 False 時,計算傳統相關性,並對複數陣列取共軛。舊行為將在 NumPy 1.5 中移除,並在 1.4 中引發 DeprecationWarning。

  2. unique1d:請改用 unique。unique1d 在 1.4 中引發棄用警告,並將在 1.5 中移除。

  3. intersect1d_nu:請改用 intersect1d。intersect1d_nu 在 1.4 中引發棄用警告,並將在 1.5 中移除。

  4. setmember1d:請改用 in1d。setmember1d 在 1.4 中引發棄用警告,並將在 1.5 中移除。

以下情況會引發錯誤

  1. 當對 0 維陣列進行操作時,numpy.max 和其他函數僅接受 axis=0axis=-1axis=None。使用超出範圍的軸表示存在錯誤,因此 Numpy 現在會針對這些情況引發錯誤。

  2. 不再允許指定 axis > MAX_DIMS;Numpy 現在會引發錯誤,而不是像 axis=None 那樣運作。

內部變更#

在可用時使用 C99 複數函數#

如果平台上可用,則 numpy 複數類型現在保證與 C99 複數類型 ABI 相容。此外,複數 ufunc 現在使用平台 C99 函數而不是我們自己的函數。

分割 multiarray 和 umath 原始碼#

multiarray 和 umath 的原始碼已分割成獨立的邏輯編譯單元。這應該使原始碼更適合新手。

獨立編譯#

預設情況下,multiarray(和 umath)的每個檔案都會合併為一個進行編譯,就像以前一樣,但如果 NPY_SEPARATE_COMPILATION 環境變數設定為非負值,則會啟用每個檔案的實驗性個別編譯。這使得在處理核心 numpy 時,編譯/偵錯週期快得多。

獨立核心數學函式庫#

已新增的新函數

  • npy_copysign

  • npy_nextafter

  • npy_cpack

  • npy_creal

  • npy_cimag

  • npy_cabs

  • npy_cexp

  • npy_clog

  • npy_cpow

  • npy_csqr

  • npy_ccos

  • npy_csin