NumPy 1.12.0 發行說明#
此版本支援 Python 2.7 和 3.4 - 3.6。
重點摘要#
NumPy 1.12.0 版本包含大量的錯誤修正和改進,但沒有特別突出的項目。這使得挑選重點摘要變得有些隨意,但以下內容可能特別值得關注,或指出可能對未來產生影響的領域。
現在可以最佳化
np.einsum
中的運算順序,以大幅提升速度。為
np.vectorize
新增signature
參數,用於使用核心維度進行向量化。已將
keepdims
參數新增至許多函式。用於測試警告的新增上下文管理器
在 numpy.distutils 中支援 BLIS
大幅改進對 PyPy 的支援(尚未完成)
已移除的支援#
已移除對 Python 2.6、3.2 和 3.3 的支援。
新增的支援#
已新增對 PyPy 2.7 v5.6.0 的支援。雖然尚未完成(尚不支援 nditer
updateifcopy
),但這是 PyPy 的 C-API 相容性層的一個里程碑。
建置系統變更#
程式庫順序會被保留,而不會為了符合目錄順序而重新排序。
已棄用功能#
ndarray 物件 data
屬性的賦值#
如 gh-7083 中指出,賦值 ‘data’ 屬性本質上是不安全的操作。此功能將在未來版本中移除。
linspace
中 num 屬性的不安全整數轉換#
當無法安全地將 num 解釋為整數時,np.linspace
現在會引發 DeprecationWarning。
binary_repr
的位元寬度參數不足#
如果傳遞給 binary_repr
的 ‘width’ 參數不足以表示以 2 為底(正數)或 2 的補數(負數)形式的數字,則該函式過去會靜默地忽略該參數,並傳回使用表示該形式所需的最少位元數的表示法。從使用者角度來看,此行為現在被認為是不安全的,並且將在未來版本中引發錯誤。
未來變更#
在 1.13 版本中,NAT 除了
NAT != NAT
會為 True 之外,其餘比較都將永遠為 False。簡而言之,NAT 的行為將類似於 NaN在 1.13 版本中,
np.average
將會保留子類別,以符合大多數其他 numpy 函式(例如 np.mean)的行為。特別是,這表示傳回純量的呼叫可能會改為傳回 0 維子類別物件。
結構化陣列的多欄位操作#
在 1.13 版本中,涉及多個欄位的結構化陣列的行為將會以兩種方式變更
首先,在 1.13 版本中,使用多個欄位(例如,arr[['f1', 'f3']]
)索引結構化陣列將會傳回原始陣列的視圖,而不是副本。請注意,與 1.12 版本中的副本不同,傳回的視圖將具有對應於原始陣列中介欄位的額外填充位元組,這將影響諸如 arr[['f1', 'f3']].view(newdtype)
之類的程式碼。
其次,對於 numpy 1.6 到 1.12 版本,結構化陣列之間的賦值是「依欄位名稱」發生的:目標陣列中的欄位會設定為來源陣列中同名的欄位,如果來源沒有該欄位,則設定為 0
>>> a = np.array([(1,2),(3,4)], dtype=[('x', 'i4'), ('y', 'i4')])
>>> b = np.ones(2, dtype=[('z', 'i4'), ('y', 'i4'), ('x', 'i4')])
>>> b[:] = a
>>> b
array([(0, 2, 1), (0, 4, 3)],
dtype=[('z', '<i4'), ('y', '<i4'), ('x', '<i4')])
在 1.13 版本中,賦值將改為「依位置」發生:目標陣列的第 N 個欄位將設定為來源陣列的第 N 個欄位,而與欄位名稱無關。舊的行為可以透過在使用索引重新排序欄位後再賦值來實現,例如,b[['x', 'y']] = a[['y', 'x']]
。
相容性注意事項#
DeprecationWarning 變更為錯誤#
使用浮點數索引會引發
IndexError
,例如,a[0, 0.0]。使用非整數 array_like 索引會引發
IndexError
,例如,a['1', '2']
使用多個省略符號索引會引發
IndexError
,例如,a[..., ...]
。用作索引值的非整數會引發
TypeError
,例如,在reshape
、take
和指定 reduce 軸時。
FutureWarning 變更為已變更行為#
如果未給定 dtype,
np.full
現在會傳回填滿值的 dtype 的陣列,而不是預設為 float。如果引數是 ndarray 的子類別,
np.average
將會發出警告,因為子類別將從 1.13 版本開始保留。(請參閱「未來變更」)
power
和 **
對於整數的負整數次方會引發錯誤#
先前的行為取決於是否涉及 numpy 純量整數或 numpy 整數陣列。
對於陣列
零的負整數次方傳回最小整數值。
1 和 -1 的負整數次方都傳回正確的值。
其餘整數在提升為負整數次方時傳回零。
對於純量
零的負整數次方傳回最小整數值。
1 和 -1 的負整數次方都傳回正確的值。
其餘整數有時傳回零,有時則傳回正確的浮點數,具體取決於整數類型組合。
除了那些通用類型為浮點數的整數組合(例如 uint64 和 int8)之外,所有這些情況現在都會引發 ValueError
。我們認為,簡單的規則是最好的方法,而不是為整數單位設定特殊的例外情況。如果您需要負數次方,請使用非精確類型。
寬鬆的 stride 檢查是預設值#
這將對假設 F_CONTIGUOUS
和 C_CONTIGUOUS
是互斥的程式碼產生一些影響,並且可以設定它們來決定現在同時為兩者的陣列的預設順序。
已修正 np.percentile
‘midpoint’ 插值法以用於精確索引#
當 ‘lower’ 和 ‘higher’ 兩者重合時,‘midpoint’ 插值器現在給出與 ‘lower’ 和 ‘higher’ 相同的結果。已修正先前 ‘lower’ + 0.5 的行為。
keepdims
kwarg 會傳遞到使用者類別方法#
接受 keepdims
kwarg 的 numpy 函式現在會將值傳遞到 ndarray 子類別上的對應方法。先前,keepdims
關鍵字會被靜默地捨棄。這些函式現在具有以下行為
如果使用者未提供
keepdims
,則不會將關鍵字傳遞到基礎方法。任何使用者提供的
keepdims
值都會作為關鍵字引數傳遞到該方法。
如果方法不支援 keepdims
kwarg,且使用者明確傳入 keepdims
,則會引發錯誤。
以下函式已變更:sum
、product
、sometrue
、alltrue
、any
、all
、amax
、amin
、prod
、mean
、std
、var
、nanmin
、nanmax
、nansum
、nanprod
、nanmean
、nanmedian
、nanvar
、nanstd
bitwise_and
恆等值已變更#
先前的恆等值為 1,現在為 -1。請參閱「改進」章節中的條目以取得更多說明。
當遇到未遮罩的無效值時,ma.median 會發出警告並傳回 nan#
與未遮罩的中位數類似,遮罩的中位數 ma.median 現在會在存在未遮罩的 NaN 的切片中發出 Runtime warning 並傳回 NaN。
assert_almost_equal
中更高的相容性#
純量的精確度檢查已變更為與陣列的檢查一致。現在是
abs(actual - desired) < 1.5 * 10**(-decimal)
請注意,這比先前的文件記載更寬鬆,但與 assert_array_almost_equal
中使用的先前實作一致。由於實作上的變更,一些非常精細的測試可能會失敗,而這些測試之前並未失敗。
測試期間警告的 NoseTester
行為#
當給定 raise_warnings="develop"
時,所有未捕獲的警告現在都會被視為測試失敗。先前僅引發選定的警告。未捕獲或未引發的警告(主要在發行模式下)將在測試週期中顯示一次,類似於預設的 python 設定。
assert_warns
和 deprecated
裝飾器更具體#
assert_warns
函式和上下文管理器現在更具體地針對給定的警告類別。這種更高的特異性導致它們根據外部警告設定進行處理。這表示在給定錯誤類別警告並在上下文外部忽略警告的情況下,可能不會引發任何警告。或者,更高的特異性可能表示先前被錯誤忽略的警告現在將會顯示或引發。另請參閱新的 suppress_warnings
上下文管理器。deprecated
裝飾器也是如此。
C API#
無變更。
新功能#
as_strided
的 Writeable 關鍵字引數#
np.lib.stride_tricks.as_strided
現在具有 writeable
關鍵字引數。當預期不會對傳回的陣列執行寫入操作時,可以將其設定為 False,以避免意外的不可預測寫入。
rot90
的 axes
關鍵字引數#
rot90
中的 axes
關鍵字引數決定陣列旋轉所在的平面。它預設為 axes=(0,1)
,與原始函式相同。
廣義化的 flip
#
flipud
和 fliplr
分別沿著 axis=0 和 axis=1 反轉陣列的元素。新加入的 flip
函式沿著任何給定的軸反轉陣列的元素。
np.count_nonzero
現在具有axis
參數,允許在不僅限於扁平化陣列物件上產生非零計數。
numpy.distutils
中的 BLIS 支援#
現在支援針對 BLIS 程式庫提供的 BLAS 實作進行建置。請參閱 site.cfg.example
(在 numpy 儲存庫或原始碼發佈的根目錄中)中的 [blis]
區段。
在 numpy/__init__.py
中加入 hook 以執行發佈特定的檢查#
numpy 的二進位發佈可能需要在 numpy 初始化期間執行特定的硬體檢查或載入特定的程式庫。例如,如果我們發佈的 numpy 包含需要 SSE2 指令的 BLAS 程式庫,我們會希望檢查執行 numpy 的機器是否具有 SSE2,以便提供資訊豐富的錯誤訊息。
在 numpy/__init__.py
中加入一個 hook,以匯入 numpy/_distributor_init.py
檔案,該檔案在標準 numpy 原始碼中將保持空白(僅包含 docstring),但可以被製作 numpy 二進位發佈的人員覆寫。
新增 nan 函式 nancumsum
和 nancumprod
#
已新增 Nan 函式 nancumsum
和 nancumprod
,以透過忽略 nan 來計算 cumsum
和 cumprod
。
np.interp
現在可以內插複數值#
np.lib.interp(x, xp, fp)
現在允許內插陣列 fp
為複數,並將以 complex128
精確度進行內插。
新增多項式求值函式 polyvalfromroots
#
新的函式 polyvalfromroots
從多項式的根評估給定點的多項式。這對於高階多項式非常有用,在高階多項式中,展開為多項式係數在機器精確度下是不準確的。
新增陣列建立函式 geomspace
#
新的函式 geomspace
產生幾何序列。它類似於 logspace
,但直接指定 start 和 stop:geomspace(start, stop)
的行為與 logspace(log10(start), log10(stop))
相同。
用於測試警告的新增上下文管理器#
已將新的上下文管理器 suppress_warnings
新增至測試工具。此上下文管理器旨在協助可靠地測試警告。特別是可靠地篩選/忽略警告。在 Python 3.4.x 之前的版本中,使用「忽略」篩選器忽略警告可能會迅速導致這些(或類似的)警告無法可靠地進行測試。
上下文管理器允許篩選(以及記錄)警告,類似於 catch_warnings
上下文,但允許更輕鬆地指定特異性。此外,列印尚未篩選的警告或巢狀上下文管理器將按預期工作。此外,可以使用上下文管理器作為裝飾器,當多個測試需要隱藏相同的警告時,這可能會很有用。
新增遮罩陣列函式 ma.convolve
和 ma.correlate
#
這些函式包裝了非遮罩版本,但會透過遮罩值傳播。有兩種不同的傳播模式。預設模式會導致遮罩值以遮罩污染結果,但另一種模式僅在沒有其他替代方案時才輸出遮罩。
新增 float_power
ufunc#
新的 float_power
ufunc 類似於 power
函式,但所有計算都以 float64 的最小精確度完成。在 numpy 郵件列表中,關於如何處理整數的負整數次方進行了長時間的討論,一個流行的提議是 __pow__
運算子應始終傳回至少 float64 精確度的結果。float_power
函式實作了該選項。請注意,它不支援物件陣列。
np.loadtxt
現在支援單一整數作為 usecol
引數#
現在允許使用 usecol=n
,而不是使用 usecol=(n,)
來讀取檔案的第 n 欄。此外,當傳遞非整數作為欄索引時,錯誤訊息更為使用者友善。
改進了 histogram
的自動 bin 估計器#
透過 bins
引數將 ‘doane’ 和 ‘sqrt’ 估計器新增至 histogram
。新增對具有自動 bin 估計的範圍限制直方圖的支援。
np.roll
現在可以同時滾動多個軸#
roll
的 shift
和 axis
引數現在彼此廣播,並且每個指定的軸都會相應地移動。
已為 ndarray 實作 __complex__
方法#
在大小為 1 的陣列上呼叫 complex()
現在會轉換為 python complex。
現在支援 pathlib.Path
物件#
標準的 np.load
、np.save
、np.loadtxt
、np.savez
和類似的函式現在可以接受 pathlib.Path
物件作為引數,而不是檔案名稱或開啟的檔案物件。
np.finfo
的新增 bits
屬性#
這使得 np.finfo
與已具有該屬性的 np.iinfo
保持一致。
np.vectorize
的新增 signature
引數#
此引數允許以 NumPy 的廣義通用函式風格,使用核心維度來向量化使用者定義的函式。這允許向量化更廣泛的函式類別。例如,可以透過 signature='(n),(n)->()'
來向量化將兩個向量組合以產生純量的任意距離度量。請參閱 np.vectorize
以取得完整詳細資訊。
針對整數陣列的除法發出 py3kwarnings#
為了協助人們將其程式碼庫從 Python 2 遷移到 Python 3,python 直譯器有一個方便的選項 -3,它會在執行階段發出警告。其中一個警告是針對整數除法
$ python -3 -c "2/3"
-c:1: DeprecationWarning: classic int division
在 Python 3 中,新的整數除法語義也適用於 numpy 陣列。在此版本中,numpy 將發出類似的警告
$ python -3 -c "import numpy as np; np.array(2)/np.array(3)"
-c:1: DeprecationWarning: numpy: classic int division
numpy.sctypes 現在在 Python3 上也包含 bytes#
先前,它在 Python2 上包含 str (bytes) 和 unicode,但在 Python3 上僅包含 str (unicode)。
改進項目#
bitwise_and
恆等值已變更#
先前的恆等值為 1,導致在使用 reduce 方法時,除了 LSB 之外的所有位元都被遮罩。新的恆等值為 -1,這在二補數機器上應能正常運作,因為所有位元都將設定為一。
廣義通用函式現在將解除鎖定 GIL#
廣義通用函式,包括 linalg 模組的大部分,現在將解除鎖定 Python 全域直譯器鎖定。
np.fft 中的快取現在在總大小和項目計數方面受到限制#
np.fft 中加速相同長度連續 FFT 的快取不再能無限增長。它們已被 LRU(最近最少使用)快取取代,如果達到記憶體大小或項目計數限制,這些快取會自動逐出不再需要的項目。
改進了零寬度字串/unicode dtype 的處理#
修正了幾個明確禁止使用零寬度字串 dtype(即 dtype('S0')
或 dtype('U0')
)的陣列的介面,並修正了幾個未正確處理此類 dtype 的錯誤。特別是,變更了 ndarray.__new__
,以在建立新陣列時,不會隱式地將 dtype('S0')
轉換為 dtype('S1')
(unicode 也一樣)。
使用 AVX2 向量化的整數 ufunc#
如果 cpu 在執行階段支援,則基本整數 ufunc 現在使用 AVX2 指令。此功能目前僅在使用 GCC 編譯時可用。
np.einsum
中的運算順序最佳化#
np.einsum
現在支援 optimize
引數,它將最佳化收縮順序。例如,np.einsum
將在單次傳遞中完成鏈點範例 np.einsum(‘ij,jk,kl->il’, a, b, c)
,其縮放比例為 N^4
;但是,當 optimize=True
時,np.einsum
將建立一個中間陣列,以將此縮放比例降低到 N^3
或有效地 np.dot(a, b).dot(c)
。使用中間張量來降低縮放比例已應用於一般的 einsum 總和表示法。請參閱 np.einsum_path
以取得更多詳細資訊。
quicksort 已變更為 introsort#
np.sort
和 np.argsort
的 quicksort 種類現在是 introsort,它是常規 quicksort,但在進度不足時會變更為 heapsort。這保留了良好的 quicksort 效能,同時將最壞情況下的執行時間從 O(N^2)
變更為 O(N*log(N))
。
ediff1d
改進了效能和子類別處理#
ediff1d 函式使用陣列而不是平面迭代器進行減法運算。當 to_begin 或 to_end 不是 None 時,減法會就地執行以消除複製操作。副作用是某些子類別得到更好的處理,即 astropy.Quantity,因為會建立完整的陣列、包裝,然後設定 begin 和 end 值,而不是使用 concatenate。
改進了 float16 陣列的 ndarray.mean
精確度#
現在以 float32 執行 float16 陣列的平均值計算,以提高精確度。這在 Theano 等套件中應該很有用,在這些套件中,float16 的精確度已足夠,且較小的佔用空間是理想的。
變更項目#
現在在 fromnumeric.py 中使用關鍵字引數呼叫所有類似陣列的方法#
在內部,fromnumeric.py 中的許多類似陣列的方法都使用位置引數而不是關鍵字引數進行呼叫,就像它們的外部簽名所做的那樣。這在下游的 ‘pandas’ 程式庫中造成了複雜性,該程式庫遇到了 ‘numpy’ 相容性的問題。現在,此模組中的所有類似陣列的方法都改為使用關鍵字引數呼叫。
在大多數情況下,對 np.memmap 物件的操作會傳回 numpy 陣列#
先前,即使結果實際上不是記憶體對應的,對 memmap 物件的操作也會誤導性地傳回 memmap 實例。例如,arr + 1
或 arr + arr
會傳回 memmap 實例,儘管輸出陣列中沒有記憶體是記憶體對應的。1.12 版本從這些操作傳回普通的 numpy 陣列。
此外,memmap 的縮減(例如 .sum(axis=None
)現在傳回 numpy 純量而不是 0 維 memmap。
警告的 stacklevel 已增加#
已增加基於 python 的警告的 stacklevel,以便大多數警告將報告使用者程式碼的錯誤行,而不是給出警告本身的行。現在已測試 stacklevel 的傳遞,以確保新警告將收到 stacklevel
引數。
這會導致具有「default」或「module」篩選器的警告針對每個錯誤的使用者程式碼行或使用者模組顯示一次,而不是僅顯示一次。在 3.4 之前的 python 版本中,這可能會導致出現先前被錯誤忽略的警告,這可能會令人驚訝,尤其是在測試套件中。