NumPy 1.7.0 發行說明#

此版本包含數個新功能以及眾多錯誤修正和重構。它支援 Python 2.4 - 2.7 和 3.1 - 3.3,並且是最後一個支援 Python 2.4 - 2.5 的版本。

重點#

  • where= ufunc 的參數(允許使用布林陣列來選擇應執行計算的位置)

  • vectorize 改善(新增了 ‘excluded’ 和 ‘cache’ 關鍵字、一般清理和錯誤修正)

  • numpy.random.choice(隨機樣本產生函數)

相容性注意事項#

在 NumPy 的未來版本中,函式 np.diag、np.diagonal 和 ndarray 的 diagonal 方法將傳回原始陣列的視圖,而不是像現在這樣產生副本。如果您寫入由這些函式中的任何一個傳回的陣列,這會有所不同。為了方便這種轉換,numpy 1.7 如果偵測到您可能嘗試寫入此類陣列,則會產生 FutureWarning。請參閱 np.diagonal 的文件以取得詳細資訊。

與上面的 np.diagonal 類似,在 NumPy 的未來版本中,使用欄位名稱清單索引記錄陣列將傳回原始陣列的視圖,而不是像現在這樣產生副本。與 np.diagonal 一樣,numpy 1.7 如果偵測到您可能嘗試寫入此類陣列,則會產生 FutureWarning。請參閱陣列索引的文件以取得詳細資訊。

在 NumPy 的未來版本中,UFunc out= 參數的預設轉換規則將從 ‘unsafe’ 變更為 ‘same_kind’。(這也適用於原地操作,例如 a += b,它等效於 np.add(a, b, out=a)。)大多數違反 ‘same_kind’ 規則的用法很可能是錯誤,因此此變更可能會暴露先前在依賴 NumPy 的專案中未偵測到的錯誤。在此版本的 NumPy 中,此類用法將繼續成功,但會引發 DeprecationWarning。

全陣列布林索引已最佳化為使用不同的最佳化程式碼路徑。此程式碼路徑應產生相同的結果,但歡迎提供有關程式碼變更的任何意見回饋。

嘗試寫入唯讀陣列(arr.flags.writeable 設定為 False 的陣列)過去會不一致地引發 RuntimeError、ValueError 或 TypeError,具體取決於採用的程式碼路徑。現在它始終如一地引發 ValueError。

<ufunc>.reduce 函式以與先前 NumPy 版本不同的順序評估某些歸約,通常提供更高的效能。由於浮點運算的性質,這可能會稍微改變某些結果,就像將 NumPy 連結到不同的 BLAS 實作(例如 MKL)一樣。

如果從 1.5 升級,那麼通常在 1.6 和 1.7 中新增了大量程式碼,並且更改了一些程式碼路徑,尤其是在類型解析和通用函式的緩衝迭代領域。如果您過去依賴意外行為,這可能會對您的程式碼產生影響。

新功能#

歸約 UFuncs 通用化 axis= 參數#

任何 ufunc.reduce 函式呼叫,以及其他歸約(例如 sum、prod、any、all、max 和 min)都支援選擇要歸約的軸子集的能力。先前,可以說 axis=None 表示所有軸,或 axis=# 選擇單一軸。現在,也可以說 axis=(#,#) 選擇軸清單進行歸約。

歸約 UFuncs 新增 keepdims= 參數#

有一個新的 keepdims= 參數,如果設定為 True,則不會丟棄歸約軸,而是將它們的大小設定為 1。當設定此選項時,歸約結果將正確廣播到已歸約的原始運算元。

Datetime 支援#

注意

datetime API 在 1.7.0 中是實驗性的,並且在 NumPy 的未來版本中可能會進行變更。

與 NumPy 1.6 相比,datetime64 有許多修正和增強功能

  • 剖析器對於僅接受 ISO 8601 日期非常嚴格,但有一些方便的擴充功能

  • 正確地在單位之間轉換

  • datetime 算術運算正常運作

  • 工作日功能(允許在僅特定星期幾有效的情況下使用 datetime)

如需更多詳細資訊,請參閱 doc/source/reference/arrays.datetime.rst 中的註解(線上文件亦可於 arrays.datetime.html 取得)。

用於列印陣列的自訂格式器#

請參閱 numpy.set_printoptions 函式的新 formatter 參數。

新函式 numpy.random.choice#

新增了一個通用取樣函式,它將從給定的類陣列產生樣本。樣本可以有或沒有替換,並且具有均勻或給定的非均勻機率。

新函式 isclose#

傳回一個布林陣列,其中兩個陣列在容差範圍內逐元素相等。可以指定相對容差和絕對容差。

多項式套件中的初步多維度支援#

軸關鍵字已新增至積分和微分函式,張量關鍵字已新增至評估函式。這些新增功能允許在這些函式中使用多維度係數陣列。用於在網格或點集上評估 2-D 和 3-D 係數陣列的新函式與可用於擬合的 2-D 和 3-D 偽 Vandermonde 矩陣一起新增。

填充 rank-n 陣列的能力#

新增了一個包含用於填充 n 維陣列的函式的 pad 模組。各種私有填充函式作為公用 ‘pad’ 函式的選項公開。範例

pad(a, 5, mode='mean')

目前的模式為 constantedgelinear_rampmaximummeanmedianminimumreflectsymmetricwrap<function>

searchsorted 的新引數#

函式 searchsorted 現在接受 ‘sorter’ 引數,該引數是一個排列陣列,用於排序要搜尋的陣列。

建置系統#

新增了對 AArch64 架構的實驗性支援。

C API#

新函式 PyArray_FailUnlessWriteable 提供了一個一致的介面,用於檢查陣列的可寫性 – 任何處理 WRITEABLE 旗標未知為 True 的陣列的 C 程式碼,都應確保在寫入之前呼叫此函式。

新增 NumPy C 風格指南 (doc/C_STYLE_GUIDE.rst)。

變更#

一般#

函式 np.concatenate 嘗試比對其輸入陣列的版面配置。先前,版面配置沒有遵循任何特定原因,並且以不良的方式取決於為串連選擇的特定軸。還修正了一個錯誤,該錯誤會靜默地允許超出範圍的軸引數。

ufuncs logical_or、logical_and 和 logical_not 現在遵循 Python 對物件陣列的行為,而不是嘗試呼叫物件上的方法。例如,運算式 (3 and ‘test’) 產生字串 ‘test’,現在 np.logical_and(np.array(3, ‘O’), np.array(‘test’, ‘O’)) 也會產生 ‘test’。

ndarray 上的 .base 屬性用於視圖,以確保記憶體擁有的基礎陣列不會過早解除配置,現在當您有視圖的視圖時,它會折疊外部參考。例如

a = np.arange(10)
b = a[1:]
c = b[1:]

在 numpy 1.6 中,c.baseb,而 c.base.basea。在 numpy 1.7 中,c.basea

為了提高對依賴 .base 舊行為的軟體的向後相容性,我們僅「跳過」與新建立的視圖類型完全相同的物件。如果您使用 ndarray 子類別,這會有所不同。例如,如果我們混合使用 ndarraymatrix 物件,它們都是同一個原始 ndarray 的視圖

a = np.arange(10)
b = np.asmatrix(a)
c = b[0, 1:]
d = c[0, 1:]

那麼 d.base 將會是 b。這是因為 d 是一個 matrix 物件,因此折疊過程僅在遇到其他 matrix 物件時才會繼續。它依序考慮 cba,而 b 是該清單中最後一個 matrix 物件的項目。

轉換規則#

由於與 NA 相關的工作,轉換規則在邊緣情況下進行了一些變更。特別是對於 scalar+scalar 的組合

  • longlong 類型 (q) 現在對於與任何其他數字 (? b h i l q p B H I) 的運算保持 longlong,先前它被轉換為 int_ (l)。ulonglong 類型 (Q) 現在保持為 ulonglong 而不是 uint (L)。

  • timedelta64 類型 (m) 現在可以與任何整數類型 (b h i l q p B H I L Q P) 混合,先前它會引發 TypeError

對於陣列 + 純量,上述規則僅廣播,除非陣列和純量是無符號/有符號整數,否則結果會轉換為陣列類型(可能更大的大小),如下列範例所示

>>> (np.zeros((2,), dtype=np.uint8) + np.int16(257)).dtype
dtype('uint16')
>>> (np.zeros((2,), dtype=np.int8) + np.uint16(257)).dtype
dtype('int16')
>>> (np.zeros((2,), dtype=np.int16) + np.uint32(2**17)).dtype
dtype('int32')

大小是否增加取決於純量的大小,例如

>>> (np.zeros((2,), dtype=np.uint8) + np.int16(255)).dtype
dtype('uint8')
>>> (np.zeros((2,), dtype=np.uint8) + np.int16(256)).dtype
dtype('uint16')

此外,complex128 純量 + float32 陣列會轉換為 complex64

在 NumPy 1.7 中,datetime64 類型 (M) 必須透過明確指定類型作為第二個引數來建構(例如 np.datetime64(2000, 'Y'))。

棄用#

一般#

使用 _format 陣列屬性指定自訂字串格式器已被棄用。可以使用 numpy.set_printoptionsnumpy.array2string 中的新 formatter 關鍵字來代替。

多項式套件中已棄用的匯入已移除。

如果 axis != 0concatenate 現在會針對 1D 陣列引發 DepractionWarning。NumPy < 1.7.0 版本忽略了 1D 陣列的軸引數值。我們目前允許這樣做,但在適當的時候我們會引發錯誤。

C-API#

直接存取 PyArrayObject* 的欄位已被棄用。長期以來,一直不建議直接存取。預計未來會對 PyArray_Descr* 和其他核心物件進行類似的棄用,以為 NumPy 2.0 做準備。

old_defines.h 中的巨集已被棄用,將在下一個主要版本 (>= 2.0) 中移除。sed 腳本 tools/replace_old_macros.sed 可用於將這些巨集替換為較新版本。

您可以透過在包含任何 NumPy 標頭之前新增由 #define NPY_NO_DEPRECATED_API 和目標版本號(例如 NPY_1_7_API_VERSION)組成的行來測試您的程式碼是否與已棄用的 C API 相容。

NPY_TYPES 列舉的 NPY_CHAR 成員已被棄用,將在 NumPy 1.8 中移除。請參閱 gh-2801 上的討論以取得更多詳細資訊。