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')
目前的模式為 constant
、edge
、linear_ramp
、maximum
、mean
、median
、minimum
、reflect
、symmetric
、wrap
和 <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.base
是 b
,而 c.base.base
是 a
。在 numpy 1.7 中,c.base
是 a
。
為了提高對依賴 .base
舊行為的軟體的向後相容性,我們僅「跳過」與新建立的視圖類型完全相同的物件。如果您使用 ndarray
子類別,這會有所不同。例如,如果我們混合使用 ndarray
和 matrix
物件,它們都是同一個原始 ndarray
的視圖
a = np.arange(10)
b = np.asmatrix(a)
c = b[0, 1:]
d = c[0, 1:]
那麼 d.base
將會是 b
。這是因為 d
是一個 matrix
物件,因此折疊過程僅在遇到其他 matrix
物件時才會繼續。它依序考慮 c
、b
和 a
,而 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_printoptions
或 numpy.array2string
中的新 formatter
關鍵字來代替。
多項式套件中已棄用的匯入已移除。
如果 axis != 0
,concatenate
現在會針對 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 上的討論以取得更多詳細資訊。