NumPy 1.8.0 發行說明#

此版本支援 Python 2.6 - 2.7 和 3.2 - 3.3。

重點#

  • 新功能,無需 2to3,通用程式碼庫支援 Python 2 和 Python 3。

  • 新功能,線性代數的 gufunc,啟用堆疊陣列上的運算。

  • 新功能,使用 .at 方法對 ufunc 進行原地花式索引。

  • 新功能,partition 函數,透過選擇進行部分排序以實現快速中位數。

  • 新功能,nanmeannanvarnanstd 函數,跳過 NaN 值。

  • 新功能,fullfull_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_axesitershapeoa_ndim == 0 的情況現在表示 0-D 迭代,且 op_axes 為 NULL,舊用法已棄用。這不會影響 NpyIter_NewNpyIter_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 僅部分排序陣列#

如果 medianoverwrite_input 選項一起使用,則輸入陣列現在僅會部分排序,而不是完全排序。

financial.npv 的修復#

npv 函數存在一個錯誤。與文件所述相反,它從索引 1M 而不是從 0M - 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 中的第三個位置兩次,而不是遞增兩次。

新函數 partitionargpartition#

透過選擇演算法部分排序陣列的新函數。

按索引 k 進行 partition 會將第 k 個最小元素移動到陣列的前面。然後,k 之前的所有元素都小於或等於位置 k 的值,而 k 之後的所有元素都大於或等於位置 k 的值。這些範圍內的值的排序是未定義的。可以提供索引序列,以一次迭代分割的方式將所有索引排序到其排序位置。這可用於有效取得樣本的順序統計量,例如中位數或百分位數。partition 的線性時間複雜度為 O(n),而完整排序的線性時間複雜度為 O(n log(n))

新函數 nanmeannanvarnanstd#

新增了新的感知 NaN 值的統計函數。在這些函數中,結果是從所有計算中省略 NaN 值所獲得的結果。

新函數 fullfull_like#

建立以特定值填滿的陣列的新便利函數;是現有 zeroszeros_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,使用維度的縮放比例得到了顯著改進。

針對 isnanisinfisfinitebyteswap 的效能改進#

isnanisinfisfinitebyteswap 已得到改進,可以利用編譯器內建函數來避免對 libc 進行昂貴的呼叫。這將這些運算的效能提高了大約兩倍(在 gnu libc 系統上)。

透過 SSE2 向量化的效能改進#

已最佳化多個函數以利用 SSE2 CPU SIMD 指令。

  • Float32 和 float64
    • 基本數學 (addsubtractdividemultiply)

    • 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 的未來版本中,它們將引發錯誤。

作者#

此版本包含以下人員的工作,他們至少為此版本貢獻了一個修補程式。名稱按名字字母順序排列

  • 87

  • Adam Ginsburg +

  • Adam Griffiths +

  • Alexander Belopolsky +

  • Alex Barth +

  • Alex Ford +

  • Andreas Hilboll +

  • Andreas Kloeckner +

  • Andreas Schwab +

  • Andrew Horton +

  • argriffing +

  • Arink Verma +

  • Bago Amirbekian +

  • Bartosz Telenczuk +

  • bebert218 +

  • Benjamin Root +

  • Bill Spotz +

  • Bradley M. Froehle

  • Carwyn Pelley +

  • Charles Harris

  • Chris

  • Christian Brueffer +

  • Christoph Dann +

  • Christoph Gohlke

  • Dan Hipschman +

  • Daniel +

  • Dan Miller +

  • daveydave400 +

  • David Cournapeau

  • David Warde-Farley

  • Denis Laxalde

  • dmuellner +

  • Edward Catmur +

  • Egor Zindy +

  • endolith

  • Eric Firing

  • Eric Fode

  • Eric Moore +

  • Eric Price +

  • Fazlul Shahriar +

  • Félix Hartmann +

  • Fernando Perez

  • Frank B +

  • Frank Breitling +

  • Frederic

  • Gabriel

  • GaelVaroquaux

  • Guillaume Gay +

  • Han Genuit

  • HaroldMills +

  • hklemm +

  • jamestwebber +

  • Jason Madden +

  • Jay Bourque

  • jeromekelleher +

  • Jesús Gómez +

  • jmozmoz +

  • jnothman +

  • Johannes Schönberger +

  • John Benediktsson +

  • John Salvatier +

  • John Stechschulte +

  • Jonathan Waltman +

  • Joon Ro +

  • Jos de Kloe +

  • Joseph Martinot-Lagarde +

  • Josh Warner (Mac) +

  • Jostein Bø Fløystad +

  • Juan Luis Cano Rodríguez +

  • Julian Taylor +

  • Julien Phalip +

  • K.-Michael Aye +

  • Kumar Appaiah +

  • Lars Buitinck

  • Leon Weber +

  • Luis Pedro Coelho

  • Marcin Juszkiewicz

  • Mark Wiebe

  • Marten van Kerkwijk +

  • Martin Baeuml +

  • Martin Spacek

  • Martin Teichmann +

  • Matt Davis +

  • Matthew Brett

  • Maximilian Albert +

  • m-d-w +

  • Michael Droettboom

  • mwtoews +

  • Nathaniel J. Smith

  • Nicolas Scheffer +

  • Nils Werner +

  • ochoadavid +

  • Ondřej Čertík

  • ovillellas +

  • Paul Ivanov

  • Pauli Virtanen

  • peterjc

  • Ralf Gommers

  • Raul Cota +

  • Richard Hattersley +

  • Robert Costa +

  • Robert Kern

  • Rob Ruana +

  • Ronan Lamy

  • Sandro Tosi

  • Sascha Peilicke +

  • Sebastian Berg

  • Skipper Seabold

  • Stefan van der Walt

  • Steve +

  • Takafumi Arakaki +

  • Thomas Robitaille +

  • Tomas Tomecek +

  • Travis E. Oliphant

  • Valentin Haenel

  • Vladimir Rutsky +

  • Warren Weckesser

  • Yaroslav Halchenko

  • Yury V. Zaytsev +

總共有 119 人為此版本做出了貢獻。名稱旁邊有「+」號的人是第一次貢獻修補程式。