NumPy 1.9.0 發行說明#
此版本支援 Python 2.6 - 2.7 和 3.2 - 3.4。
重點#
在許多領域都有顯著的效能提升,尤其是在索引和小型陣列操作方面速度明顯加快。索引操作現在也會釋放 GIL。
新增 nanmedian 和 nanpercentile 完善了 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 版本中,涉及包含特殊值 NaN
、Inf
和 -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.seed
和 np.random.RandomState
現在在種子無法安全地轉換為 32 位元無號整數時會擲回 ValueError
。現在失敗的應用程式可以透過遮罩較高的 32 位元值為零來修正:seed = seed & 0xFFFFFFFF
。這是在舊版本中靜默完成的,因此隨機串流保持不變。
Argmin 和 argmax out 參數#
現在檢查 np.argmin
和 np.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.reduce 或 sum) 的非整數軸索引已棄用。
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_item
和 sq_ass_item
序列方法中的負索引#
當直接存取用於項目取得的 sq_item
或 sq_ass_item
PyObject 插槽時,將不再支援負索引。PySequence_GetItem
和 PySequence_SetItem
會修正負索引,以便可以在那裡使用它們。
NDIter#
當現在呼叫 NpyIter_RemoveAxis
時,迭代器範圍將會重設。
當追蹤多重索引且迭代器未緩衝時,可以使用 NpyIter_RemoveAxis
。在這種情況下,迭代器的大小可能會縮小。由於迭代器的總大小受到限制,因此迭代器在這些呼叫之前可能太大。在這種情況下,其大小將設定為 -1
,並且在移除多重索引、設定迭代器範圍或取得下一個函數時,而不是在建構時發出錯誤。
這對目前運作的程式碼沒有影響,但強調了在可能發生這些條件時檢查錯誤返回的必要性。在大多數情況下,正在迭代的陣列與迭代器一樣大,因此不會發生此類問題。
此變更已套用至 1.8.1 版本。
zeros_like
用於字串 dtype 現在返回空字串#
為了與 zeros 函數匹配,zeros_like 現在返回以空字串初始化的陣列,而不是以 '0' 填充的陣列。
新功能#
百分位數支援更多插值選項#
np.percentile
現在具有 interpolation 關鍵字引數,用於指定當百分位數落在兩個值之間時,應以哪種方式插值點。請參閱文件以取得可用選項。
中位數和百分位數的廣義軸支援#
np.median
和 np.percentile
現在支援廣義軸引數,就像 ufunc 縮減自 1.7 以來所做的那樣。現在可以說 axis=(index, index) 來選擇用於縮減的軸列表。還新增了 keepdims
關鍵字引數,以允許方便地廣播到原始形狀的陣列。
dtype 參數已新增至 np.linspace
和 np.logspace
#
現在可以使用 dtype 參數指定從 linspace
和 logspace
函數返回的資料型別。
更通用的 np.triu
和 np.tril
廣播#
對於 ndim
超過 2 的陣列,這些函數現在將應用於最後兩個軸,而不是引發例外。
tobytes
是 tostring
方法的別名#
已新增 ndarray.tobytes
和 MaskedArray.tobytes
作為 tostring
的別名,後者將陣列匯出為 bytes
。這在 Python 3 中更一致,其中 str
和 bytes
不相同。
建置系統#
新增對 ppc64le 和 OpenRISC 架構的實驗性支援。
與 python numbers 模組的相容性#
所有數值 numpy 型別現在都在 python numbers
模組中的型別階層中註冊。
increasing
參數已新增至 np.vander
#
可以使用這個新的布林引數指定 Vandermonde 矩陣的欄排序。
unique_counts
參數已新增至 np.unique
#
現在可以取得每個唯一項目在輸入中出現的次數作為可選的傳回值。
nanfunctions 中對中位數和百分位數的支援#
np.nanmedian
和 np.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.where
和 random
模組現在使用每個狀態鎖定而不是 GIL。
MaskedArray 支援更複雜的基底類別#
正在移除基底類別行為類似於純陣列的內建假設。特別是,repr
和 str
現在應更可靠地運作。
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
即使 a 和 b 中的陣列是同一個物件,也將始終返回 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 版本。