NumPy 1.13.0 發行說明#

此版本支援 Python 2.7 和 3.4 - 3.6。

重點#

  • 例如 a + b + c 的操作將會在某些平台上重複使用暫存空間,從而減少記憶體使用並加快執行速度。

  • 原地操作會檢查輸入是否與輸出重疊,並建立暫存空間以避免問題。

  • 新的 __array_ufunc__ 屬性為類別提供更佳的能力來覆寫預設的 ufunc 行為。

  • 新的 np.block 函數用於建立區塊陣列。

新函數#

  • 新的 np.positive ufunc。

  • 新的 np.divmod ufunc 提供更有效率的 divmod。

  • 新的 np.isnat ufunc 測試 NaT 特殊值。

  • 新的 np.heaviside ufunc 計算 Heaviside 函數。

  • 新的 np.isin 函數,改進了 in1d

  • 新的 np.block 函數用於建立區塊陣列。

  • 新的 PyArray_MapIterArrayCopyIfOverlap 已新增至 NumPy C-API。

詳情請見下方。

棄用#

  • 呼叫 np.fixnp.isposinfnp.isneginf 時使用 f(x, y=out) 已被棄用 - 參數應以 f(x, out=out) 傳遞,這與其他類似 ufunc 的介面一致。

  • 自 1.7 版本以來已棄用的 C-API NPY_CHAR 型別編號現在將在執行時引發棄用警告。使用較舊 f2py 版本建置的擴充功能需要重新編譯以移除警告。

  • np.ma.argsortnp.ma.minimum.reducenp.ma.maximum.reduce 應在應用於超過 2 個維度的陣列時,使用明確的 axis 參數呼叫,因為此參數的預設值 (None) 與 numpy 的其餘部分不一致(分別為 -100)。

  • np.ma.MaskedArray.mini 已被棄用,因為它幾乎重複了 np.MaskedArray.min 的功能。完全等效的行為可以使用 np.ma.minimum.reduce 取得。

  • np.ma.minimumnp.ma.maximum 的單一參數形式已被棄用。np.maximumnp.ma.minimum(x) 現在應拼寫為 np.ma.minimum.reduce(x),這與使用 np.minimum 的方式一致。

  • 在非數值 dtype 上呼叫 ndarray.conjugate 已被棄用(它應與 np.conjugate 的行為一致,後者會拋出錯誤)。

  • axis 關鍵字不滿足 -a.ndim - 1 <= axis <= a.ndim 時,呼叫 expand_dims 已被棄用,其中 a 是正在重新塑形的陣列。

未來變更#

  • 在 NumPy 1.14 中,具有不同欄位名稱的結構化陣列之間的賦值將會變更。先前,dst 中的欄位會設定為 src 中同名欄位的值。在 numpy 1.14 中,欄位將改為「依位置」賦值:dst 的第 n 個欄位將設定為 src 陣列的第 n 個欄位。請注意,NumPy 1.12 中引發的 FutureWarning 不正確地將此變更報告為排程在 NumPy 1.13 而非 NumPy 1.14 中。

建置系統變更#

  • numpy.distutils 現在使用 GCC 相容編譯器自動判斷 C 檔案的依賴關係。

相容性注意事項#

錯誤型別變更#

  • 當輸入為空時,numpy.hstack() 現在會拋出 ValueError 而不是 IndexError

  • 接受 axis 參數的函數,當該參數超出範圍時,現在會拋出 np.AxisError 而不是 IndexErrorValueError 的混合。為了向後相容性,AxisError 是這兩者的子類別。

Tuple 物件 dtype#

已移除對某些不明確 dtype 的支援,這些 dtype 是無意中允許的,形式為 (old_dtype, new_dtype),其中任一 dtype 是或包含 object dtype。作為例外,形式為 (object, [('name', object)]) 的 dtype 仍受支援,因為有證據顯示現有使用。

DeprecationWarning 變更為錯誤#

如需更多詳細資訊,請參閱「變更」章節。

  • partition,當使用非整數分割索引時發生 TypeError。

  • NpyIter_AdvancedNew,當 oa_ndim == 0op_axes 為 NULL 時發生 ValueError

  • negative(bool_),當負號應用於布林值時發生 TypeError。

  • subtract(bool_, bool_),當從布林值減去布林值時發生 TypeError。

  • np.equal, np.not_equal,物件身分不會覆寫失敗的比較。

  • np.equal, np.not_equal,物件身分不會覆寫非布林比較。

  • 已捨棄已棄用的布林索引行為。詳情請參閱下方的「變更」。

  • 已移除已棄用的 np.alterdot()np.restoredot()

FutureWarning 變更為已變更的行為#

如需更多詳細資訊,請參閱「變更」章節。

  • numpy.average 保留子類別

  • array == Nonearray != None 執行元素wise比較。

  • np.equal, np.not_equal,物件身分不會覆寫比較結果。

dtype 現在永遠為 true#

先前,bool(dtype) 會回退到預設的 python 實作,後者會檢查 len(dtype) > 0。由於 dtype 物件將 __len__ 實作為記錄欄位的數量,因此純量 dtype 的 bool 會評估為 False,這是違反直覺的。現在,對於所有 dtype,bool(dtype) == True

ndarray 子類別中不再需要 __getslice____setslice__#

在 Python 2.7 中建立 np.ndarray 的子類別時,不再_需要_在衍生類別上實作 __*slice__,因為 __*item__ 將正確攔截這些呼叫。

任何實作這些的程式碼都將與之前完全一樣地運作。調用``ndarray.__getslice__`` 的程式碼(例如,透過 super(...).__getslice__)現在將發出 DeprecationWarning - 應改為使用 .__getitem__(slice(start, end))

現在使用 ... (省略號) 索引 MaskedArrays/Constants 會傳回 MaskedArray#

此行為反映了 np.ndarray 的行為,並考量了物件 dtype 的 MaskedArrays 中的巢狀陣列,以及與其他形式索引結合的省略號。

C API 變更#

GUfuncs 在空陣列和 NpyIter 軸移除上的行為#

現在允許從 NpyIter 移除零大小的軸。這可能表示從 NpyIter 移除軸的程式碼在稍後存取移除的維度時,必須新增額外檢查。

最大的後續變更是 gufuncs 現在允許具有零大小的內部維度。這表示 gufunc 現在必須預期空的內部維度,而這在以前是不可能的,並且會引發錯誤。

對於大多數 gufuncs,應該不需要變更。但是,現在對於具有例如 (..., N, M) -> (..., M) 簽名的 gufuncs,如果 N=0,則可以傳回有效的結果,而無需進一步包裝程式碼。

PyArray_MapIterArrayCopyIfOverlap 已新增至 NumPy C-API#

PyArray_MapIterArray 類似,但具有額外的 copy_if_overlap 參數。如果 copy_if_overlap != 0,則檢查輸入是否與任何其他陣列有記憶體重疊,並在輸入在迭代期間被修改時,視情況建立副本以避免問題。如需更完整的說明文件,請參閱文件。

新功能#

已新增 __array_ufunc__#

這是重新命名和重新設計的 __numpy_ufunc__。任何類別,無論是否為 ndarray 子類別,都可以定義此方法或將其設定為 None,以便覆寫 NumPy 的 ufuncs 行為。這與 Python 的 __mul__ 和其他二元運算常式非常相似。如需此新選項的實作和行為的更詳細說明,請參閱文件。API 是暫時性的,我們尚不保證向後相容性,因為可能會根據回饋進行修改。如需更多詳細資訊,請參閱 NEP 13文件

新的 positive ufunc#

此 ufunc 對應於一元 +,但與 ndarray 上的 + 不同,如果陣列值不支援數值運算,它將引發錯誤。

新的 divmod ufunc#

此 ufunc 對應於 Python 內建的 divmod,並用於在 numpy 陣列上呼叫時實作 divmodnp.divmod(x, y) 計算的結果等同於 (np.floor_divide(x, y), np.remainder(x, y)),但速度大約是單獨呼叫函數的兩倍。

np.isnat ufunc 測試 NaT 特殊日期時間和時間差值#

新的 ufunc np.isnat 尋找日期時間和時間差陣列中特殊 NaT 值的位置。這類似於 np.isnan

np.heaviside ufunc 計算 Heaviside 函數#

新函數 np.heaviside(x, h0) (一個 ufunc) 計算 Heaviside 函數

                   { 0   if x < 0,
heaviside(x, h0) = { h0  if x == 0,
                   { 1   if x > 0.

np.block 函數用於建立區塊陣列#

將新的 block 函數新增至目前的堆疊函數 vstackhstackstack。這允許同時跨多個軸串聯,語法與陣列建立類似,但元素本身可以是陣列。例如

>>> A = np.eye(2) * 2
>>> B = np.eye(3) * 3
>>> np.block([
...     [A,               np.zeros((2, 3))],
...     [np.ones((3, 2)), B               ]
... ])
array([[ 2.,  0.,  0.,  0.,  0.],
       [ 0.,  2.,  0.,  0.,  0.],
       [ 1.,  1.,  3.,  0.,  0.],
       [ 1.,  1.,  0.,  3.,  0.],
       [ 1.,  1.,  0.,  0.,  3.]])

雖然主要用於區塊矩陣,但這適用於任意維度的陣列。

它類似於 Matlab 用於建立區塊矩陣的方括號表示法。

isin 函數,改進了 in1d#

新函數 isin 測試 N 維陣列的每個元素是否存在於第二個陣列中的任何位置。它是 in1d 的增強功能,可保留第一個陣列的形狀。

暫存消除#

在提供 backtrace 函數的平台上,NumPy 將嘗試避免在涉及基本數值型別的表達式中建立暫存空間。例如,d = a + b + c 會轉換為 d = a + b; d += c,這可以提高大型陣列的效能,因為執行操作所需的記憶體頻寬更少。

uniqueaxes 參數#

在 N 維陣列中,使用者現在可以使用 numpy.unique 選擇要沿哪個軸尋找重複的 N-1 維元素。如果 axis=None (預設值),則會恢復原始行為。

np.gradient 現在支援間距不均勻的資料#

使用者現在可以為資料指定非恆定的間距。特別是,np.gradient 現在可以接受

  1. 單一純量,用於指定所有維度的樣本距離。

  2. N 個純量,用於指定每個維度的恆定樣本距離。即 dxdydz、…

  3. N 個陣列,用於指定沿 F 每個維度的值的座標。陣列的長度必須與對應維度的大小相符

  4. N 個純量/陣列的任何組合,其含義如 2. 和 3. 所示。

這表示,例如,現在可以執行以下操作

>>> f = np.array([[1, 2, 6], [3, 4, 5]], dtype=np.float_)
>>> dx = 2.
>>> y = [1., 1.5, 3.5]
>>> np.gradient(f, dx, y)
[array([[ 1. ,  1. , -0.5], [ 1. ,  1. , -0.5]]),
 array([[ 2. ,  2. ,  2. ], [ 2. ,  1.7,  0.5]])]

apply_along_axis 中支援傳回任意維度的陣列#

先前,傳遞給 apply_along_axis 的函數只能傳回純量或 1D 陣列。現在,它可以傳回任何維度(包括 0D)的陣列,並且此陣列的形狀會取代正在迭代的陣列的軸。

已將 .ndim 屬性新增至 dtype 以補充 .shape#

為了與 ndarraybroadcast 一致,d.ndimlen(d.shape) 的簡寫。

在 Python 3.6 中支援 tracemalloc#

NumPy 現在支援使用 Python 3.6 或更新版本的 tracemalloc 模組進行記憶體追蹤。來自 NumPy 的記憶體配置會放入由 numpy.lib.tracemalloc_domain 定義的網域中。請注意,NumPy 配置不會顯示在較早 Python 版本的 tracemalloc 中。

NumPy 可以使用放寬步幅檢查偵錯功能建置#

當啟用放寬步幅檢查時,在環境中設定 NPY_RELAXED_STRIDES_DEBUG=1 將導致 NumPy 在編譯時將受影響的步幅設定為 npy_intp 的最大值,以便協助偵測下游專案中步幅的無效使用。啟用後,無效使用通常會導致引發錯誤,但錯誤的確切型別取決於程式碼的詳細資訊。在實際應用中已觀察到 TypeError 和 OverflowError。

先前,發行版本會停用此選項,而在 master 中啟用,並且在這兩者之間變更需要編輯程式碼。現在預設為停用,但可以為測試組建啟用。

改進#

Ufunc 對於重疊輸入的行為#

由於資料依賴性問題,在先前的 NumPy 版本中,ufunc 輸入和輸出運算元具有記憶體重疊的操作會產生未定義的結果。在 NumPy 1.13.0 中,此類操作的結果現在定義為與沒有記憶體重疊的等效操作相同。

受影響的操作現在會根據需要建立暫時副本,以消除資料依賴性。由於偵測這些案例的計算成本很高,因此使用啟發式方法,這可能在極少數情況下導致不必要的暫時副本。對於啟發式方法可以分析的資料依賴性足夠簡單的操作,即使陣列重疊,如果可以推斷出不需要副本,也不會建立暫時副本。例如,``np.add(a, b, out=a)`` 將不會涉及副本。

為了說明先前未定義的操作

>>> x = np.arange(16).astype(float)
>>> np.add(x[1:], x[:-1], out=x[1:])

在 NumPy 1.13.0 中,最後一行保證等同於

>>> np.add(x[1:].copy(), x[:-1].copy(), out=x[1:])

具有簡單且無問題的資料依賴性的類似操作為

>>> x = np.arange(16).astype(float)
>>> np.add(x[1:], x[:-1], out=x[:-1])

它將繼續產生與先前 NumPy 版本相同的結果,並且不會涉及不必要的暫時副本。

此變更也適用於原地二元運算,例如

>>> x = np.random.rand(500, 500)
>>> x += x.T

此陳述式現在保證等同於 x[...] = x + x.T,而在先前的 NumPy 版本中,結果是未定義的。

使用 MinGW 部分支援 64 位元 f2py 擴充功能#

現在可以使用免費的 MinGW 工具組(也在 Python 3.5 下)建置包含 Fortran 程式庫的擴充功能。這對於僅執行計算並適度使用執行階段的擴充功能效果最佳(例如,從檔案讀取和寫入)。請注意,這並未消除對 Mingwpy 的需求;如果您大量使用執行階段,您很可能會遇到 問題。相反地,它應被視為一種權宜之計,直到 Mingwpy 完全正常運作為止。

也可以使用 MinGW 工具組和來自 (可移動) WinPython 3.4 發行版的執行階段程式庫編譯擴充功能,這對於具有 PySide1/Qt4 前端的程式可能很有用。

packbitsunpackbits 的效能改進#

已最佳化具有布林輸入的函數 numpy.packbitsnumpy.unpackbits,使其對於連續資料而言速度明顯更快。

修正 PPC long double 浮點資訊#

在先前的 NumPy 版本中,finfo 函數傳回關於 Power PC (PPC) 上 longdouble 浮點型別的 double double 格式的無效資訊。無效值是 NumPy 演算法無法處理有效位數中可變數量的數字所導致的,這是 PPC long double 的一個特徵。此版本透過使用啟發式方法來偵測 PPC double double 格式的存在,繞過了失敗的演算法。使用這些啟發式方法的副作用是 finfo 函數比先前的版本更快。

ndarray 子類別的更佳預設 repr#

沒有 repr 特化的 ndarray 子類別現在可以正確縮排其資料和型別行。

更可靠的遮罩陣列比較#

遮罩陣列的比較對於遮罩純量而言存在錯誤,並且對於維度高於一的結構化陣列而言會失敗。這兩個問題現在都已解決。在此過程中,確保在取得結構化陣列的結果時,會正確忽略遮罩欄位,即,如果兩個陣列中所有非遮罩欄位都相等,則結果相等,從而使行為與比較非結構化遮罩陣列,然後在某些軸上執行 .all() 所獲得的行為相同。

現在可以使用字串語法建立具有布林元素元素的 np.matrix#

每當嘗試將 np.matrix 與布林值一起使用時(例如,np.matrix('True')),np.matrix 都會失敗。現在,這可以如預期般運作。

更多 linalg 操作現在接受空向量和矩陣#

現在,當給定最後兩個維度中具有 0 的輸入陣列時,np.linalg 中的所有以下函數都可運作:detslogdetpinveigvalseigvalsheigeigh

捆綁的 LAPACK 版本現在為 3.2.2#

NumPy 捆綁了 lapack 的最小實作,適用於未安裝 lapack 程式庫的系統,名稱為 lapack_lite。這已從 LAPACK 3.0.0(1999 年 6 月 30 日)升級到 LAPACK 3.2.2(2010 年 6 月 30 日)。如需此升級所帶來的所有變更的詳細資訊,請參閱 LAPACK 變更日誌

雖然沒有透過 numpy 公開任何新功能,但這修正了一些關於「工作區」大小的錯誤,並且在某些地方可能會使用更快的演算法。

在更多情況下允許 np.hypot.reducenp.logical_xorreduce#

現在這適用於空陣列,傳回 0,並且可以跨多個軸減少。先前,在這些情況下會拋出 ValueError

更佳的物件陣列 repr#

包含自身的物件陣列不再導致遞迴錯誤。

現在以一種方式列印包含 list 物件的物件陣列,這種方式清楚地區分了 2d 物件陣列和 1d 列表物件陣列。

變更#

遮罩陣列上的 argsort 採用與 sort 相同的預設引數#

預設情況下,argsort 現在將遮罩值放在排序陣列的末尾,這與 sort 先前已執行的方式相同。此外,為了與 sort 一致,argsort 新增了 end_with 引數。請注意,此引數不是在末尾新增的,因此會中斷任何將 fill_value 作為位置引數傳遞的程式碼。

average 現在保留子類別#

對於 ndarray 子類別,numpy.average 現在將傳回子類別的實例,這與大多數其他 NumPy 函數(例如 mean)的行為相符。因此,傳回純量的呼叫現在也可能傳回子類別陣列純量。

array == Nonearray != None 執行元素wise比較#

先前,這些操作分別傳回純量 FalseTrue

np.equal, np.not_equal 用於物件陣列時會忽略物件識別#

先前,這些函數總是將相同的物件視為相等。這會導致覆寫比較失敗、比較未傳回布林值的物件(例如 np.arrays),以及比較結果與物件識別不同的物件(例如 NaNs)。

布林索引變更#

  • 布林陣列型別(例如 python 布林值列表)總是會被視為布林索引。

  • 布林純量(包含 python True)是合法的布林索引,且永遠不會被視為整數。

  • 布林索引必須符合它們所索引的軸的維度。

  • 在賦值的左側使用的布林索引必須符合右側的維度。

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

np.random.multivariate_normal 在處理錯誤共變異數矩陣時的行為#

現在可以透過使用兩個新的關鍵字引數來調整函數在處理共變異數矩陣時的行為

  • tol 可用於指定在檢查共變異數矩陣是否為半正定矩陣時使用的容差。

  • check_valid 可用於配置函數在遇到非半正定矩陣時的行為。有效的選項為 ignorewarnraise。預設值 warn 保留了先前版本中使用的行為。

assert_array_less 現在會比較 np.inf-np.inf#

先前,np.testing.assert_array_less 會忽略所有無限值。這不符合文件和直覺上的預期行為。現在,對於任何實數 x,-inf < x < inf 都被視為 True,所有其他情況都會失敗。

assert_array_ 和遮罩陣列 assert_equal 隱藏較少的警告#

先前被 assert_array_ 函數隱藏的一些警告現在不再隱藏。在大多數情況下,這些警告應該是正確的,如果它們發生,則需要變更使用這些函數的測試。對於遮罩陣列 assert_equal 版本,比較 NaT 時可能會發生警告。此函數目前未特別處理 NaT 或 NaN,如果由於此變更而出現警告,最好此時避免使用它。

memmap 物件中的 offset 屬性值#

memmap 物件中的 offset 屬性現在設定為檔案中的偏移量。這僅對於大於 mmap.ALLOCATIONGRANULARITY 的偏移量才是行為變更。

np.realnp.imag 對於純量輸入傳回純量#

先前,當提供純量輸入時,np.realnp.imag 過去會傳回陣列物件,這與其他函數(例如 np.anglenp.conj)不一致。

多項式便利類別不能傳遞給 ufuncs#

ABCPolyBase 類別(便利類別由此衍生而來)設定 __array_ufun__ = None 以退出 ufuncs。如果多項式便利類別實例作為引數傳遞給 ufunc,現在將會引發 TypeError

ufunc 的輸出引數也可以是元組,對於 ufunc 方法也是如此#

對於 ufuncs 的呼叫,已經可以且建議對具有多個輸出的 ufuncs 使用帶有元組的 out 引數。現在已將其擴展到 reduceaccumulatereduceat 方法中的輸出引數。這主要是為了與 __array_ufunc 相容;目前還沒有具有多個輸出的 ufuncs。