NumPy 1.9.0 發行說明#

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

重點#

  • 在許多領域都有顯著的效能提升,尤其是在索引和小型陣列操作方面速度明顯加快。索引操作現在也會釋放 GIL。

  • 新增 nanmediannanpercentile 完善了 nanfunction 集合。

已移除的支援#

  • 已移除 oldnumeric 和 numarray 模組。

  • 已移除 doc/pyrex 和 doc/cython 目錄。

  • 已移除 doc/numpybook 目錄。

  • 已移除 numpy/testing/numpytest.py 檔案及其包含的 importall 函數。

未來變更#

  • numpy/polynomial/polytemplate.py 檔案將在 NumPy 1.10.0 中移除。

  • Numpy 1.10.0 中,原地操作的預設轉換將更改為 'same_kind'。這肯定會破壞目前忽略警告的某些程式碼。

  • 寬鬆的步幅檢查將成為 1.10.0 中的預設值

  • 字串版本檢查將會中斷,因為例如 '1.9' > '1.10' 為 True。已新增 NumpyVersion 類別,可用於此類比較。

  • diagonal 和 diag 函數將在 1.10.0 中返回可寫入的視圖

  • S 和/或 a dtype 可能會更改為表示 Python 字串而不是位元組,在 Python 3 中,這兩種型別非常不同。

相容性注意事項#

diagonal 和 diag 函數返回唯讀視圖。#

在 NumPy 1.8 中,diagonal 和 diag 函數返回唯讀副本,在 NumPy 1.9 中,它們返回唯讀視圖,而在 1.10 中,它們將返回可寫入的視圖。

特殊純量浮點數值不再導致向上轉換為 double#

在先前的 numpy 版本中,涉及包含特殊值 NaNInf-Inf 的浮點純量的運算,會導致結果型別至少為 float64。由於特殊值可以用最小的可用浮點型別表示,因此不再執行向上轉換。

例如,dtype 為

np.array([1.], dtype=np.float32) * float('nan')

現在仍然是 float32,而不是轉換為 float64。涉及非特殊值的運算沒有變更。

百分位數輸出變更#

如果給定多個要計算的百分位數,numpy.percentile 會返回一個陣列而不是列表。單一百分位數仍然返回純量。此陣列相當於將舊版本中返回的列表透過 np.array 轉換為陣列。

如果使用 overwrite_input 選項,則輸入僅部分排序而不是完全排序。

ndarray.tofile 例外類型#

所有 tofile 例外現在都是 IOError,之前有些是 ValueError

無效的填充值例外#

numpy.ma.core._check_fill_value 的兩個變更

  • 當填充值是字串且陣列型別不是 'OSUV' 之一時,會引發 TypeError,而不是使用預設填充值。

  • 當填充值溢出陣列型別時,會引發 TypeError,而不是 OverflowError。

多項式類別不再衍生自 PolyBase#

這可能會對依賴於多項式類別衍生自 PolyBase 的人員造成問題。它們現在都衍生自抽象基底類別 ABCPolyBase。嚴格來說,應該涉及棄用,但找不到任何使用舊基底類別的外部程式碼。

使用 numpy.random.binomial 可能會更改 RNG 狀態 (相較於 numpy < 1.9)#

已修正產生二項式隨機變數的其中一個演算法中的錯誤。此變更可能會改變執行的隨機繪製次數,因此在呼叫 distribution.c::rk_binomial_btpe 後,序列位置將會不同。任何依賴於 RNG 處於已知狀態的測試都應檢查和/或更新。

隨機種子強制為 32 位元無號整數#

np.random.seednp.random.RandomState 現在在種子無法安全地轉換為 32 位元無號整數時會擲回 ValueError。現在失敗的應用程式可以透過遮罩較高的 32 位元值為零來修正:seed = seed & 0xFFFFFFFF。這是在舊版本中靜默完成的,因此隨機串流保持不變。

Argmin 和 argmax out 參數#

現在檢查 np.argminnp.argmax 及其等效 C-API 函數的 out 參數是否與所需的輸出形狀完全匹配。如果檢查失敗,則會引發 ValueError 而不是 TypeError

Einsum#

移除不必要的廣播表示法限制。np.einsum('ijk,j->ijk', A, B) 也可以寫成 np.einsum('ij...,j->ij...', A, B) (在 'j' 上不再需要省略符號)

索引#

NumPy 索引在此版本中已完全重寫。這使得大多數進階整數索引操作更快,並且不應有其他影響。但是,在進階索引操作中引入了一些細微的變更和棄用

  • 布林索引到純量陣列將始終返回新的 1 維陣列。這表示 array(1)[array(True)] 給出 array([1]) 而不是原始陣列。

  • 進階索引到一維陣列過去在值陣列的形狀太小或不匹配時,對於指派中重複值陣列具有 (未記錄的) 特殊處理。使用此功能的程式碼將引發錯誤。為了相容性,您可以使用 arr.flat[index] = values,它使用舊的程式碼分支。(例如 a = np.ones(10); a[np.arange(10)] = [1, 2, 3])

  • 進階索引的迭代順序過去始終是 C 順序。在 NumPy 1.9 中,迭代順序會適應輸入,並且不保證 (除了為相容性原因而永遠不會反轉的單一進階索引)。這表示如果將多個值指派給同一個元素,則結果未定義。例如 arr[[0, 0], [1, 1]] = [1, 2],這可能會將 arr[0, 1] 設定為 1 或 2。

  • 與迭代順序等效,進階索引結果的記憶體佈局會調整為更快的索引,並且無法預測。

  • 所有索引操作都會返回視圖或副本。沒有索引操作會返回原始陣列物件。(例如 arr[...])

  • 在未來,布林陣列類物件 (例如 python 布林列表) 將始終被視為布林索引,而布林純量 (包括 python True) 將是合法的布林索引。此時,純量陣列已經是這種情況,以允許一般 positive = a[a > 0]a 為零維時也能運作。

  • 在 NumPy 1.8 中,如果運算的結果是純量,則可以使用 array(True)array(False) 等效於 1 和 0。這將在 NumPy 1.9 中引發錯誤,並且如上所述,在未來將被視為布林索引。

  • 所有非整數陣列類物件都已棄用,自訂整數類物件的物件陣列可能必須明確轉換。

  • 進階索引的錯誤報告更具資訊性,但是錯誤型別在某些情況下已變更。(索引陣列的廣播錯誤報告為 IndexError)

  • 使用多個省略符號 (...) 進行索引已棄用。

非整數縮減軸索引已棄用#

縮減 ufunc (如 add.reducesum) 的非整數軸索引已棄用。

promote_types 和字串 dtype#

當給定整數或浮點 dtype 作為一個引數,以及字串 dtype 作為另一個引數時,promote_types 函數現在會返回有效的字串長度。先前,即使輸入字串 dtype 不夠長以儲存轉換為字串的最大整數/浮點值,它也始終返回輸入字串 dtype。

can_cast 和字串 dtype#

如果字串 dtype 長度不足以儲存轉換為字串的最大整數/浮點值,則 can_cast 函數現在在「安全」轉換模式下針對整數/浮點 dtype 和字串 dtype 返回 False。先前,can_cast 在「安全」模式下針對整數/浮點 dtype 和任何長度的字串 dtype 返回 True。

astype 和字串 dtype#

如果要在「安全」轉換模式下轉換到的字串 dtype 不夠長以容納正在轉換的整數/浮點陣列的最大值,則 astype 方法現在會返回錯誤。先前,即使結果被截斷,也允許轉換。

npyio.recfromcsv 關鍵字參數變更#

npyio.recfromcsv 不再接受未記錄的 update 關鍵字,該關鍵字過去用於覆寫 dtype 關鍵字。

doc/swig 目錄已移動#

doc/swig 目錄已移動到 tools/swig

npy_3kcompat.h 標頭已變更#

已從 npy_3kcompat.h 中移除未使用的 simple_capsule_dtor 函數。請注意,此標頭不適用於 numpy 外部;其他專案在需要時應使用此檔案的自有副本。

C-Api sq_itemsq_ass_item 序列方法中的負索引#

當直接存取用於項目取得的 sq_itemsq_ass_item PyObject 插槽時,將不再支援負索引。PySequence_GetItemPySequence_SetItem 會修正負索引,以便可以在那裡使用它們。

NDIter#

當現在呼叫 NpyIter_RemoveAxis 時,迭代器範圍將會重設。

當追蹤多重索引且迭代器未緩衝時,可以使用 NpyIter_RemoveAxis。在這種情況下,迭代器的大小可能會縮小。由於迭代器的總大小受到限制,因此迭代器在這些呼叫之前可能太大。在這種情況下,其大小將設定為 -1,並且在移除多重索引、設定迭代器範圍或取得下一個函數時,而不是在建構時發出錯誤。

這對目前運作的程式碼沒有影響,但強調了在可能發生這些條件時檢查錯誤返回的必要性。在大多數情況下,正在迭代的陣列與迭代器一樣大,因此不會發生此類問題。

此變更已套用至 1.8.1 版本。

zeros_like 用於字串 dtype 現在返回空字串#

為了與 zeros 函數匹配,zeros_like 現在返回以空字串初始化的陣列,而不是以 '0' 填充的陣列。

新功能#

百分位數支援更多插值選項#

np.percentile 現在具有 interpolation 關鍵字引數,用於指定當百分位數落在兩個值之間時,應以哪種方式插值點。請參閱文件以取得可用選項。

中位數和百分位數的廣義軸支援#

np.mediannp.percentile 現在支援廣義軸引數,就像 ufunc 縮減自 1.7 以來所做的那樣。現在可以說 axis=(index, index) 來選擇用於縮減的軸列表。還新增了 keepdims 關鍵字引數,以允許方便地廣播到原始形狀的陣列。

dtype 參數已新增至 np.linspacenp.logspace#

現在可以使用 dtype 參數指定從 linspacelogspace 函數返回的資料型別。

更通用的 np.triunp.tril 廣播#

對於 ndim 超過 2 的陣列,這些函數現在將應用於最後兩個軸,而不是引發例外。

tobytestostring 方法的別名#

已新增 ndarray.tobytesMaskedArray.tobytes 作為 tostring 的別名,後者將陣列匯出為 bytes。這在 Python 3 中更一致,其中 strbytes 不相同。

建置系統#

新增對 ppc64le 和 OpenRISC 架構的實驗性支援。

與 python numbers 模組的相容性#

所有數值 numpy 型別現在都在 python numbers 模組中的型別階層中註冊。

increasing 參數已新增至 np.vander#

可以使用這個新的布林引數指定 Vandermonde 矩陣的欄排序。

unique_counts 參數已新增至 np.unique#

現在可以取得每個唯一項目在輸入中出現的次數作為可選的傳回值。

nanfunctions 中對中位數和百分位數的支援#

np.nanmediannp.nanpercentile 函數的行為與中位數和百分位數函數類似,只是會忽略 NaN。

已新增 NumpyVersion 類別#

可以從 numpy.lib 匯入此類別,並且當 numpy 版本達到 1.10.devel 時,可以用於版本比較。例如

>>> from numpy.lib import NumpyVersion
>>> if NumpyVersion(np.__version__) < '1.10.0'):
...     print('Wow, that is an old NumPy version!')

允許儲存具有大量命名欄位的陣列#

numpy 儲存格式 1.0 僅允許陣列標頭的總大小為 65535 位元組。具有大量欄位的結構化陣列可能會超過此限制。已新增新的格式 2.0,將標頭大小擴展到 4 GiB。np.save 如果資料需要,將自動以 2.0 格式儲存,否則將始終使用更相容的 1.0 格式。

完全支援 np.cross 廣播#

np.cross 現在可以正確地廣播其兩個輸入陣列,即使它們具有不同的維度數。在較早的版本中,這會導致引發錯誤或計算出錯誤的結果。

改進#

在某些情況下,sum 的數值穩定性更佳#

現在在 sum 方法中使用成對求和,但僅沿著快速軸,並且對於長度 <= 8192 的值組。這也應在某些常見情況下提高 var 和 std 的準確性。

百分位數以 np.partition 實作#

np.percentile 已使用 np.partition 實作,後者僅透過選擇演算法部分排序資料。這將時間複雜度從 O(nlog(n)) 提高到 O(n)

np.array 的效能提升#

使用 np.array 將包含陣列的列表轉換為陣列的效能已提高。現在它的速度與 np.vstack(list) 相當。

np.searchsorted 的效能提升#

對於內建數值型別,np.searchsorted 不再依賴資料型別的 compare 函數來執行搜尋,而是現在由型別特定的函數實作。根據輸入的大小,這可能會導致效能提高 2 倍以上。

np.distutils 的可選減少冗長模式#

設定 numpy.distutils.system_info.system_info.verbosity = 0,然後呼叫 numpy.distutils.system_info.get_info('blas_opt') 將不會在輸出上印出任何內容。這主要適用於使用 numpy.distutils 的其他套件。

np.random.multivariate_normal 中的共變異數檢查#

當共變異數矩陣不是正半定時,會引發 RuntimeWarning 警告。

多項式類別不再基於範本#

多項式類別已重構為使用抽象基底類別而不是範本,以便實作通用介面。這使得匯入多項式套件更快,因為類別不需要在匯入時編譯。

更多 GIL 釋放#

現在更多函數釋放全域直譯器鎖定,允許使用 threading 模組進行更有效率的平行化。最值得注意的是,現在針對花式索引釋放 GIL,np.whererandom 模組現在使用每個狀態鎖定而不是 GIL。

MaskedArray 支援更複雜的基底類別#

正在移除基底類別行為類似於純陣列的內建假設。特別是,reprstr 現在應更可靠地運作。

C-API#

棄用#

用於序列重複的非整數純量已棄用#

使用非整數 numpy 純量重複 python 序列已棄用。例如,np.float_(2) * [1] 在未來將會是一個錯誤。

select 輸入棄用#

已棄用 select 的整數和空輸入。在未來,只有布林陣列才是有效的條件,而空的 condlist 將被視為輸入錯誤,而不是返回預設值。

rank 函數#

已棄用 rank 函數,以避免與 numpy.linalg.matrix_rank 混淆。

物件陣列相等性比較#

在未來,物件陣列比較 ==np.equal 都將不再使用身分檢查。例如

>>> a = np.array([np.array([1, 2, 3]), 1])
>>> b = np.array([np.array([1, 2, 3]), 1])
>>> a == b

即使 ab 中的陣列是同一個物件,也將始終返回 False (並且在未來會返回錯誤)。

如果廣播或元素比較等失敗,則等號運算子 == 在未來將會引發類似 np.equal 的錯誤。

arr == None 的比較在未來將會執行逐元素比較,而不是僅返回 False。程式碼應使用 arr is None

所有這些變更此時都會發出 Deprecation 或 FutureWarning。

C-API#

公用程式函數 npy_PyFile_Dup 和 npy_PyFile_DupClose 已被 python 3 應用於其檔案物件的內部緩衝破壞。為了修正此問題,在 npy_3kcompat.h 中宣告了兩個新函數 npy_PyFile_Dup2 和 npy_PyFile_DupClose2,並且已棄用舊函數。由於這些函數的脆弱性,建議盡可能改用 python API。

此變更已套用至 1.8.1 版本。