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.fix
、np.isposinf
和np.isneginf
時使用f(x, y=out)
已被棄用 - 參數應以f(x, out=out)
傳遞,這與其他類似 ufunc 的介面一致。自 1.7 版本以來已棄用的 C-API
NPY_CHAR
型別編號現在將在執行時引發棄用警告。使用較舊 f2py 版本建置的擴充功能需要重新編譯以移除警告。np.ma.argsort
、np.ma.minimum.reduce
和np.ma.maximum.reduce
應在應用於超過 2 個維度的陣列時,使用明確的 axis 參數呼叫,因為此參數的預設值 (None
) 與 numpy 的其餘部分不一致(分別為-1
、0
和0
)。np.ma.MaskedArray.mini
已被棄用,因為它幾乎重複了np.MaskedArray.min
的功能。完全等效的行為可以使用np.ma.minimum.reduce
取得。np.ma.minimum
和np.ma.maximum
的單一參數形式已被棄用。np.maximum
。np.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
而不是IndexError
和ValueError
的混合。為了向後相容性,AxisError
是這兩者的子類別。
Tuple 物件 dtype#
已移除對某些不明確 dtype 的支援,這些 dtype 是無意中允許的,形式為 (old_dtype, new_dtype)
,其中任一 dtype 是或包含 object
dtype。作為例外,形式為 (object, [('name', object)])
的 dtype 仍受支援,因為有證據顯示現有使用。
DeprecationWarning 變更為錯誤#
如需更多詳細資訊,請參閱「變更」章節。
partition
,當使用非整數分割索引時發生 TypeError。NpyIter_AdvancedNew
,當oa_ndim == 0
且op_axes
為 NULL 時發生 ValueErrornegative(bool_)
,當負號應用於布林值時發生 TypeError。subtract(bool_, bool_)
,當從布林值減去布林值時發生 TypeError。np.equal, np.not_equal
,物件身分不會覆寫失敗的比較。np.equal, np.not_equal
,物件身分不會覆寫非布林比較。已捨棄已棄用的布林索引行為。詳情請參閱下方的「變更」。
已移除已棄用的
np.alterdot()
和np.restoredot()
。
FutureWarning 變更為已變更的行為#
如需更多詳細資訊,請參閱「變更」章節。
numpy.average
保留子類別array == None
和array != 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 陣列上呼叫時實作 divmod。np.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
函數新增至目前的堆疊函數 vstack
、hstack
和 stack
。這允許同時跨多個軸串聯,語法與陣列建立類似,但元素本身可以是陣列。例如
>>> 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
,這可以提高大型陣列的效能,因為執行操作所需的記憶體頻寬更少。
unique
的 axes
參數#
在 N 維陣列中,使用者現在可以使用 numpy.unique
選擇要沿哪個軸尋找重複的 N-1 維元素。如果 axis=None
(預設值),則會恢復原始行為。
np.gradient
現在支援間距不均勻的資料#
使用者現在可以為資料指定非恆定的間距。特別是,np.gradient
現在可以接受
單一純量,用於指定所有維度的樣本距離。
N 個純量,用於指定每個維度的恆定樣本距離。即
dx
、dy
、dz
、…N 個陣列,用於指定沿 F 每個維度的值的座標。陣列的長度必須與對應維度的大小相符
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
#
為了與 ndarray
和 broadcast
一致,d.ndim
是 len(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 前端的程式可能很有用。
packbits
和 unpackbits
的效能改進#
已最佳化具有布林輸入的函數 numpy.packbits
和 numpy.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
中的所有以下函數都可運作:det
、slogdet
、pinv
、eigvals
、eigvalsh
、eig
、eigh
。
捆綁的 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.reduce
和 np.logical_xor
的 reduce
#
現在這適用於空陣列,傳回 0,並且可以跨多個軸減少。先前,在這些情況下會拋出 ValueError
。
更佳的物件陣列 repr
#
包含自身的物件陣列不再導致遞迴錯誤。
現在以一種方式列印包含 list
物件的物件陣列,這種方式清楚地區分了 2d 物件陣列和 1d 列表物件陣列。
變更#
遮罩陣列上的 argsort
採用與 sort
相同的預設引數#
預設情況下,argsort
現在將遮罩值放在排序陣列的末尾,這與 sort
先前已執行的方式相同。此外,為了與 sort
一致,argsort
新增了 end_with
引數。請注意,此引數不是在末尾新增的,因此會中斷任何將 fill_value
作為位置引數傳遞的程式碼。
average
現在保留子類別#
對於 ndarray 子類別,numpy.average
現在將傳回子類別的實例,這與大多數其他 NumPy 函數(例如 mean
)的行為相符。因此,傳回純量的呼叫現在也可能傳回子類別陣列純量。
array == None
和 array != None
執行元素wise比較#
先前,這些操作分別傳回純量 False
和 True
。
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
可用於配置函數在遇到非半正定矩陣時的行為。有效的選項為ignore
、warn
和raise
。預設值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.real
和 np.imag
對於純量輸入傳回純量#
先前,當提供純量輸入時,np.real
和 np.imag
過去會傳回陣列物件,這與其他函數(例如 np.angle
和 np.conj
)不一致。
多項式便利類別不能傳遞給 ufuncs#
ABCPolyBase 類別(便利類別由此衍生而來)設定 __array_ufun__ = None
以退出 ufuncs。如果多項式便利類別實例作為引數傳遞給 ufunc,現在將會引發 TypeError
。
ufunc 的輸出引數也可以是元組,對於 ufunc 方法也是如此#
對於 ufuncs 的呼叫,已經可以且建議對具有多個輸出的 ufuncs 使用帶有元組的 out
引數。現在已將其擴展到 reduce
、accumulate
和 reduceat
方法中的輸出引數。這主要是為了與 __array_ufunc
相容;目前還沒有具有多個輸出的 ufuncs。