NumPy 1.8.0 發行說明#
此版本支援 Python 2.6 - 2.7 和 3.2 - 3.3。
重點#
新功能,無需 2to3,通用程式碼庫支援 Python 2 和 Python 3。
新功能,線性代數的 gufunc,啟用堆疊陣列上的運算。
新功能,使用
.at
方法對 ufunc 進行原地花式索引。新功能,
partition
函數,透過選擇進行部分排序以實現快速中位數。新功能,
nanmean
、nanvar
和nanstd
函數,跳過 NaN 值。新功能,
full
和full_like
函數,用於建立以特定值初始化的陣列。新功能,
PyUFunc_RegisterLoopForDescr
,更好地支援使用者 dtype 的 ufunc。許多領域的效能改進。
已移除的支援#
已移除對 Python 2.4 和 2.5 版本的支援。
SCons 的支援已被移除。
未來變更#
Datetime64 類型在此版本中仍為實驗性質。在 1.9 版本中,可能會有一些變更使其更實用。
diagonal 方法目前傳回一個新陣列,並引發 FutureWarning。在 1.9 版本中,它將傳回唯讀視圖。
從結構化類型陣列中選擇多個欄位目前傳回一個新陣列,並引發 FutureWarning。在 1.9 版本中,它將傳回唯讀視圖。
numpy/oldnumeric 和 numpy/numarray 相容性模組將在 1.9 版本中移除。
相容性注意事項#
doc/sphinxext 內容已移至其自身的 github 儲存庫,並作為子模組包含在 numpy 中。請參閱 doc/HOWTO_BUILD_DOCS.rst 中的說明,以了解如何存取內容。
numpy.void 純量雜湊函數已變更。先前,資料的指標被雜湊為整數。現在,雜湊函數使用元組雜湊演算法來組合純量元素的雜湊函數,但僅限於純量為唯讀時。
Numpy 已將其建置系統預設切換為使用「獨立編譯」。在先前的版本中,此功能受到支援,但不是預設設定。這應產生與舊系統相同的結果,但如果您嘗試執行複雜的操作,例如靜態連結 numpy 或使用不常見的編譯器,則可能會遇到問題。如果遇到問題,請提交錯誤報告,作為臨時解決方案,您可以透過匯出 shell 變數 NPY_SEPARATE_COMPILATION=0 來重新啟用舊的建置系統。
對於 AdvancedNew iterator,oa_ndim
旗標現在應為 -1,以指示未傳入 op_axes
和 itershape
。oa_ndim == 0
的情況現在表示 0-D 迭代,且 op_axes
為 NULL,舊用法已棄用。這不會影響 NpyIter_New
或 NpyIter_MultiNew
函數。
函數 nanargmin 和 nanargmax 現在對所有 NaN 切片的索引傳回 np.iinfo['intp'].min。先前,這些函數對於陣列傳回會引發 ValueError,對於純量傳回會引發 NaN。
NPY_RELAXED_STRIDES_CHECKING#
有一個新的編譯時期環境變數 NPY_RELAXED_STRIDES_CHECKING
。如果此變數設定為 1,則 numpy 會將更多陣列視為 C 或 F 連續的陣列 – 例如,可以同時擁有被視為 C 和 F 連續的行向量。新的定義更準確,允許更快的程式碼,減少不必要的複製,並簡化 numpy 的內部程式碼。但是,它也可能破壞對 C 和 F 連續陣列的步幅值做出過於強烈假設的第三方程式庫。(目前已知這也會破壞使用 memoryview 的 Cython 程式碼,這將在 Cython 中修復。)這將在未來的版本中成為預設設定,因此請立即使用以下方式建置的 NUMPY 測試您的程式碼
NPY_RELAXED_STRIDES_CHECKING=1 python setup.py install
您可以透過執行以下程式碼檢查 NPY_RELAXED_STRIDES_CHECKING 是否生效
np.ones((10, 1), order="C").flags.f_contiguous
如果啟用寬鬆步幅檢查,則這將為 True
,否則為 False
。到目前為止,我們看到的一般問題是使用 C 連續陣列的 C 程式碼,並假設可以透過查看 PyArray_STRIDES(arr)
陣列中的最後一個元素來存取 itemsize。當寬鬆步幅生效時,這是不正確的(實際上,在某些極端情況下,它從來都不是正確的)。請改用 PyArray_ITEMSIZE(arr)
。
如需更多資訊,請查看文件中的「ndarray 的內部記憶體佈局」章節。
以非陣列作為第二個引數的二元運算#
形式為 <陣列或子類別> * <非陣列子類別>
的二元運算,其中 <非陣列子類別>
宣告的 __array_priority__
高於 <陣列或子類別>
的二元運算,現在將無條件傳回 NotImplemented,讓 <非陣列子類別>
有機會處理運算。先前,僅當 <非陣列子類別>
實際實作了反向運算,並且在嘗試(可能很昂貴的)<非陣列子類別>
的陣列轉換之後,才會傳回 NotImplemented。(錯誤,提取請求)
與 overwrite_input 一起使用的函數 median 僅部分排序陣列#
如果 median 與 overwrite_input 選項一起使用,則輸入陣列現在僅會部分排序,而不是完全排序。
financial.npv 的修復#
npv 函數存在一個錯誤。與文件所述相反,它從索引 1
到 M
而不是從 0
到 M - 1
進行求和。此修復程式變更了傳回值。mirr 函數呼叫了 npv 函數,但解決了此問題,因此也修復了 mirr 函數,且 mirr 函數的傳回值保持不變。
比較 NaN 數字時的執行階段警告#
比較 NaN
浮點數現在會引發 invalid
執行階段警告。如果預期會出現 NaN
,則可以使用 np.errstate 忽略此警告。例如:
with np.errstate(invalid='ignore'):
operation()
新功能#
支援堆疊陣列上的線性代數#
gufunc 機制現在用於 np.linalg,允許對堆疊陣列和向量進行運算。例如:
>>> a
array([[[ 1., 1.],
[ 0., 1.]],
[[ 1., 1.],
[ 0., 1.]]])
>>> np.linalg.inv(a)
array([[[ 1., -1.],
[ 0., 1.]],
[[ 1., -1.],
[ 0., 1.]]])
ufunc 的原地花式索引#
已將函數 at
新增至 ufunc 物件,以允許在使用花式索引時進行原地 ufunc,且無需緩衝。例如,以下程式碼將遞增陣列中的第一項和第二項,並將第三項遞增兩次:numpy.add.at(arr, [0, 1, 2, 2], 1)
許多人錯誤地認為 arr[[0, 1, 2, 2]] += 1
會執行此操作,但這樣做無效,因為 arr[2]
的遞增值只是被複製到 arr
中的第三個位置兩次,而不是遞增兩次。
新函數 partition 和 argpartition#
透過選擇演算法部分排序陣列的新函數。
按索引 k
進行 partition
會將第 k
個最小元素移動到陣列的前面。然後,k
之前的所有元素都小於或等於位置 k
的值,而 k
之後的所有元素都大於或等於位置 k
的值。這些範圍內的值的排序是未定義的。可以提供索引序列,以一次迭代分割的方式將所有索引排序到其排序位置。這可用於有效取得樣本的順序統計量,例如中位數或百分位數。partition
的線性時間複雜度為 O(n)
,而完整排序的線性時間複雜度為 O(n log(n))
。
新函數 nanmean、nanvar 和 nanstd#
新增了新的感知 NaN 值的統計函數。在這些函數中,結果是從所有計算中省略 NaN 值所獲得的結果。
新函數 full 和 full_like#
建立以特定值填滿的陣列的新便利函數;是現有 zeros 和 zeros_like 函數的補充。
與大型檔案的 IO 相容性#
可以在 64 位元系統上載入大於 2GB 的大型 NPZ 檔案。
針對 OpenBLAS 建置#
現在可以透過編輯 site.cfg 針對 OpenBLAS 建置 numpy。
新常數#
尤拉常數現在在 numpy 中以 euler_gamma 的形式公開。
qr 的新模式#
已將新模式「complete」、「reduced」和「raw」新增至 qr 分解,舊的「full」和「economic」模式已棄用。「reduced」模式取代了舊的「full」模式,並且是預設模式,與「full」模式相同,因此可以透過不指定模式來維持向後相容性。
「complete」模式傳回完整的維度分解,這對於取得範圍空間的正交補集的基礎可能很有用。「raw」模式傳回包含 Householder 反射器和縮放因子的陣列,這些陣列可用於將來應用 q,而無需轉換為矩陣。「economic」模式已完全棄用,它沒有太多用途,並且不比「raw」模式更有效率。
新的 invert 引數到 in1d#
函數 in1d 現在接受 invert 引數,當 True 時,會使傳回的陣列反轉。
使用 np.newaxis 的進階索引#
現在可以將 np.newaxis/None 與索引陣列一起使用,而不是僅在簡單索引中使用。這表示 array[np.newaxis, [0, 1]]
現在將如預期般運作,並在陣列前面加上新軸時選取前兩列。
C-API#
現在可以使用內建輸入類型和自訂輸出類型註冊新的 ufunc。在此變更之前,當從 Python 呼叫 ufunc 時,NumPy 無法找到正確的 ufunc 迴圈函數,因為 ufunc 迴圈簽名比對邏輯沒有查看輸出運算元類型。現在可以找到正確的 ufunc 迴圈,前提是用戶端提供具有正確輸出類型的輸出引數。
runtests.py#
新增了一個簡單的測試執行器指令碼 runtests.py
。它也會透過 setup.py build
建置 Numpy,並且可以用於在開發期間輕鬆執行測試。
改進#
IO 效能改進#
透過分塊改進了讀取大型檔案的效能(另請參閱 IO 相容性)。
針對 pad 的效能改進#
pad 函數有一個新的實作,大幅改進了除 mode= 之外的所有輸入的效能(為向後相容性而保留)。對於 rank >= 4,使用維度的縮放比例得到了顯著改進。
針對 isnan、isinf、isfinite 和 byteswap 的效能改進#
isnan、isinf、isfinite 和 byteswap 已得到改進,可以利用編譯器內建函數來避免對 libc 進行昂貴的呼叫。這將這些運算的效能提高了大約兩倍(在 gnu libc 系統上)。
透過 SSE2 向量化的效能改進#
已最佳化多個函數以利用 SSE2 CPU SIMD 指令。
- Float32 和 float64
基本數學 (add、subtract、divide、multiply)
sqrt
minimum/maximum
absolute
- Bool
logical_or
logical_and
logical_not
這將這些運算的效能提高了 float32/float64 高達 4 倍/2 倍,bool 高達 10 倍,具體取決於資料在 CPU 快取中的位置。效能提升對於原地運算最顯著。
為了使用改進的函數,必須在編譯時啟用 SSE2 指令集。在 x86_64 系統上預設啟用。在具有功能的 CPU 的 x86_32 上,必須透過將適當的旗標傳遞給 CFLAGS 建置變數 (-msse2 與 gcc) 來啟用。
針對 median 的效能改進#
median 現在以 partition 而不是 sort 實作,這將其時間複雜度從 O(n log(n)) 降低到 O(n)。如果與 overwrite_input 選項一起使用,則陣列現在僅會部分排序,而不是完全排序。
ufunc C-API 中可覆寫的運算元旗標#
在建立 ufunc 時,可以透過 ufunc 物件的新 op_flags 屬性覆寫預設 ufunc 運算元旗標。例如,若要將第一個輸入的運算元旗標設定為讀取/寫入
PyObject *ufunc = PyUFunc_FromFuncAndData(…); ufunc->op_flags[0] = NPY_ITER_READWRITE;
這允許 ufunc 在原地執行運算。此外,也可以透過 ufunc 物件的新 iter_flags 屬性覆寫全域 nditer 旗標。例如,若要為 ufunc 設定 reduce 旗標
ufunc->iter_flags = NPY_ITER_REDUCE_OK;
變更#
一般#
函數 np.take 現在允許將 0-d 陣列作為索引。
獨立編譯模式現在預設啟用。
對 np.insert 和 np.delete 的多項變更
先前,負索引和指向陣列結尾之後的索引會被簡單地忽略。現在,這將引發 Future 或 Deprecation Warning。在未來,它們將像一般索引處理它們一樣處理 – 負索引將會環繞,而超出範圍的索引將會產生錯誤。
先前,布林索引被視為整數(始終參考陣列中的第 0 個或第 1 個項目)。在未來,它們將被視為遮罩。在此版本中,它們會引發 FutureWarning 警告即將發生的變更。
在 Numpy 1.7 中,np.insert 已允許語法 np.insert(arr, 3, [1,2,3]) 在單個位置插入多個項目。在 Numpy 1.8 中,np.insert(arr, [3], [1, 2, 3]) 也可能如此。
來自 np.pad 的填充區域現在已正確四捨五入,而不是截斷。
C-API 陣列新增功能#
已將四個新函數新增至陣列 C-API。
PyArray_Partition
PyArray_ArgPartition
PyArray_SelectkindConverter
PyDataMem_NEW_ZEROED
C-API Ufunc 新增功能#
已將一個新函數新增至 ufunc C-API,該函數允許使用 descr 為使用者類型註冊內部迴圈。
PyUFunc_RegisterLoopForDescr
C-API 開發人員改進#
PyArray_Type
實例建立函數 tp_new
現在使用 tp_basicsize
來判斷要配置多少記憶體。在先前的版本中,僅配置了 sizeof(PyArrayObject)
位元組的記憶體,通常需要 C-API 子類型重新實作 tp_new
。
棄用#
qr 分解的「full」和「economic」模式已棄用。
一般#
已棄用將非整數用於索引和大多數整數引數。先前,浮點索引和函數引數(例如軸或形狀)會被截斷為整數,而沒有警告。例如,arr.reshape(3., -1) 或 arr[0.] 將在 NumPy 1.8 中觸發棄用警告,並且在 NumPy 的未來版本中,它們將引發錯誤。