NumPy 1.11.0 發行說明#
此版本支援 Python 2.6 - 2.7 和 3.2 - 3.5,並包含許多增強功能和改進。另請注意以下列出的建置系統變更,因為它們可能具有細微的影響。
由於工具鏈損壞,此版本未提供 Windows (TM) 二進制檔案。Windows (TM) Python 套件的供應商之一是您的最佳選擇。
重點#
這些改進的詳細資訊可以在下面找到。
datetime64 型別現在是時區無知型別。
已將 dtype 參數新增至
randint
。改進了對可能共享記憶體的兩個陣列的偵測。
自動箱子大小估計,用於
np.histogram
。A @ A.T 和 dot(A, A.T) 的速度最佳化。
用於重新排序陣列軸的新函式
np.moveaxis
。
建置系統變更#
NumPy 現在使用
setuptools
而非純粹的 distutils 來進行建置。這修正了在依賴 NumPy 的專案的setup.py
檔案中使用install_requires='numpy'
的問題 (請參閱 gh-6551)。這可能會影響 NumPy 本身的建置/安裝方法的行為。請在 NumPy 問題追蹤器上報告任何非預期的行為。Bento 建置支援和相關檔案已移除。
單一檔案建置支援和相關檔案已移除。
未來變更#
以下變更已排定在 NumPy 1.12.0 中。
將會移除對 Python 2.6、3.2 和 3.3 的支援。
寬鬆的 stride 檢查將成為預設值。請參閱 1.8.0 發行說明,以獲得關於此變更含義的更詳細討論。
datetime64 “非時間”(NaT) 值的行為將會變更,以符合浮點數“非數字”(NaN) 值的行為:所有涉及 NaT 的比較都將返回 False,但 NaT != NaT 除外,它將返回 True。
使用浮點數進行索引將會引發 IndexError,例如,a[0, 0.0]。
使用非整數 array_like 進行索引將會引發
IndexError
,例如,a['1', '2']
使用多個省略號進行索引將會引發
IndexError
,例如,a[..., ...]
。非整數用作索引值將會引發
TypeError
,例如,在reshape
、take
和指定 reduce 軸時。
在未來的版本中,將會進行以下變更。
將會移除在
numpy.testing
中公開的rand
函式。該函式是早期 NumPy 的遺留物,並使用 Python random 模組實作。應該改為使用numpy.random
中的隨機數字產生器。ndarray.view
方法將僅允許使用 c_contiguous 陣列,以使用不同大小的 dtype 進行檢視,進而導致最後一個維度變更。這與目前的行為不同,在目前的行為中,f_contiguous 但非 c_contiguous 的陣列可以被視為不同大小的 dtype 型別,進而導致第一個維度變更。切片
MaskedArray
將會返回資料**和**遮罩的檢視。目前,遮罩是寫入時複製的,而且切片中遮罩的變更不會傳播到原始遮罩。請參閱下面的 FutureWarnings 章節以取得詳細資訊。
相容性注意事項#
datetime64 變更#
在先前版本的 NumPy 中,實驗性的 datetime64 型別始終以 UTC 格式儲存時間。預設情況下,從字串建立 datetime64 物件或列印它會從本地時間轉換或轉換為本地時間
# old behavior
>>> np.datetime64('2000-01-01T00:00:00')
numpy.datetime64('2000-01-01T00:00:00-0800') # note the timezone offset -08:00
datetime64 使用者達成共識,認為此行為是不理想的,並且與 datetime64 通常的使用方式 (例如,由 pandas 使用) 相悖。對於大多數使用案例,時區無知 datetime 型別是較佳的選擇,類似於 Python 標準函式庫中的 datetime.datetime
型別。因此,datetime64 不再假設輸入為本地時間,也不會列印本地時間
>>> np.datetime64('2000-01-01T00:00:00')
numpy.datetime64('2000-01-01T00:00:00')
為了向後相容性,datetime64 仍然會剖析時區偏移量,並透過轉換為 UTC 來處理。但是,產生的 datetime 是時區無知型別
>>> np.datetime64('2000-01-01T00:00:00-08')
DeprecationWarning: parsing timezone aware datetimes is deprecated;
this will raise an error in the future
numpy.datetime64('2000-01-01T08:00:00')
作為此變更的必然結果,我們不再禁止在具有日期單位的 datetime 和具有時間單位的 datetime 之間進行轉換。使用時區無知 datetime,從日期轉換為時間的規則不再模稜兩可。
linalg.norm
傳回型別變更#
linalg.norm
函式的傳回型別現在是浮點數,沒有例外。某些範數型別先前傳回整數。
多項式擬合變更#
numpy 多項式套件中的各種擬合函式不再接受非整數作為次數規格。
np.dot 現在引發 TypeError
而不是 ValueError
#
此行為模仿其他函式 (例如 np.inner
) 的行為。如果兩個引數無法轉換為通用型別,則可能會根據其順序引發 TypeError
或 ValueError
。現在,np.dot
現在將始終引發 TypeError
。
FutureWarning 到變更的行為#
在
np.lib.split
中,結果中的空陣列始終具有維度(0,)
,無論要分割的陣列的維度為何。此行為已變更,以便維度將會保留。自 NumPy 1.9 以來,此變更的FutureWarning
已就位,但由於錯誤,有時不會引發警告,而且維度已經保留。
%
和 //
運算子#
這些運算子分別使用 remainder
和 floor_divide
函式實作。這些函式現在以 fmod
為基礎,並一起計算,以便彼此相容,並與浮點型別的 Python 版本相容。與先前的結果相比,結果應該稍微更準確或完全是錯誤修正,但在捨入誤差會對 floor_divide
傳回的整數產生影響的情況下,結果可能會顯著不同。某些邊緣情況也會變更,例如,當除數為零時,NaN 始終針對這兩個函式傳回,divmod(1.0, inf)
傳回 (0.0, 1.0)
,但在 MSVC 2008 上除外,而 divmod(-1.0, inf)
傳回 (-1.0, inf)
。
C API#
移除了 PyUFuncObject
結構的 check_return
和 inner_loop_selector
成員 (將它們替換為 reserved
插槽以保留結構佈局)。這些成員從未使用於任何用途,因此第三方程式碼不太可能使用它們,但我們在此處提及以求完整。
舊式類別的物件 dtype 偵測#
在 python 2 中,屬於舊式使用者定義類別執行個體的物件不再在 dtype 偵測處理常式中自動計為「物件」型別。相反地,如同在 python 3 中,它們可能會被計為序列,但前提是它們同時定義了 __len__ 和 __getitem__ 方法。這修正了 python 2 和 3 之間的區段錯誤和不一致。
新功能#
np.histogram
現在提供外掛程式估算器,用於自動估算最佳箱子數量。將 ['auto'、'fd'、'scott'、'rice'、'sturges'] 之一作為引數傳遞給 'bins' 會導致使用對應的估算器。已新增使用 Airspeed Velocity 的基準測試套件,轉換先前的 vbench 基準測試套件。您可以透過
python runtests.py --bench
在本機執行該套件。如需更多詳細資訊,請參閱benchmarks/README.rst
。已新增新的函式
np.shares_memory
,可以精確檢查兩個陣列是否具有記憶體重疊。np.may_share_memory
現在也具有可花費更多精力來減少誤判的選項。SkipTest
和KnownFailureException
例外類別在numpy.testing
命名空間中公開。在測試函式中引發它們,以將測試標記為要略過,或將其標記為已知失敗。f2py.compile
具有新的extension
關鍵字參數,允許為產生的暫存檔指定 fortran 副檔名。例如,可以將檔案指定為*.f90
。verbose
引數也會啟用,先前會忽略它。已將
dtype
參數新增至np.random.randint
。現在可以產生以下型別的隨機 ndarraynp.bool_
,np.int8
、np.uint8
、np.int16
、np.uint16
、np.int32
、np.uint32
、np.int64
、np.uint64
、np.int_ ``, ``np.intp
規格是按精確度而不是按 C 型別。因此,在某些平台上,
np.int64
可能是long
而不是long long
,即使指定的 dtype 是long long
,因為兩者可能具有相同的精確度。產生的型別取決於 numpy 針對給定精確度使用的 C 型別。位元組順序規格也會被忽略,產生的陣列始終採用原生位元組順序。新的
np.moveaxis
函式允許透過明確提供來源軸和目的地軸,將一個或多個陣列軸移動到新的位置。此函式應該比目前的rollaxis
函式更易於使用,並提供更多功能。各種
numpy.polynomial
擬合的deg
參數已擴充為接受要包含在擬合中的項的次數清單,所有其他項的係數都限制為零。變更向後相容,傳遞純量deg
將會像以前一樣運作。已將模仿 Python 版本的浮點型別 divmod 函式新增至 npy_math 函式庫。
改進#
np.gradient
現在支援 axis
引數#
為了保持一致性,已將 axis
參數新增至 np.gradient
。它允許指定計算梯度所依據的軸。
np.lexsort
現在支援具有物件資料型別的陣列#
當型別未實作合併排序型別的 argsort
方法時,此函式現在會在內部呼叫泛型 npy_amergesort
。
np.ma.core.MaskedArray
現在支援 order
引數#
在建構新的 MaskedArray
執行個體時,可以使用類似於呼叫 np.ndarray
時的 order
引數來配置它。此引數的加入允許在幾個 MaskedArray 相關的公用程式函式 (例如 np.ma.core.array
和 np.ma.core.asarray
) 中正確處理 order
引數。
遮罩陣列的記憶體和速度改進#
現在使用 mask=True
(或 mask=False
) 建立遮罩陣列會使用 np.ones
(或 np.zeros
) 來建立遮罩,這樣速度更快,並避免了大量的記憶體峰值。已完成另一個最佳化,以避免在列印遮罩陣列時出現記憶體峰值和無用的計算。
ndarray.tofile
現在在 linux 上使用 fallocate#
此函式現在使用 fallocate 系統呼叫,在支援它的檔案系統上保留足夠的磁碟空間。
形式為 A.T @ A
和 A @ A.T
的運算的最佳化#
先前,gemm
BLAS 運算用於所有矩陣乘積。現在,如果矩陣乘積是在矩陣及其轉置之間,它將使用 syrk
BLAS 運算來提高效能。此最佳化已擴充到 @
、numpy.dot
、numpy.inner
和 numpy.matmul
。
注意: 需要轉置和非轉置矩陣來共享資料。
np.testing.assert_warns
現在可以用作上下文管理器#
這符合 assert_raises
的行為。
np.random.shuffle 的速度改進#
np.random.shuffle
對於 1d ndarray 現在快得多。
變更#
已從 numpy.distutils
移除 Pyrex 支援#
方法 build_src.generate_a_pyrex_source
將保持可用;使用者已對其進行猴子補丁,以支援 Cython 而不是 Pyrex。建議切換到更好地支援的建置 Cython 擴充功能的方法。
np.broadcast
現在可以使用單一引數呼叫#
在這種情況下,產生的物件將僅模仿對單一陣列的迭代。此變更使以下區別過時
- if len(x) == 1
shape = x[0].shape
- else
shape = np.broadcast(*x).shape
相反地,np.broadcast
可以在所有情況下使用。
np.trace
現在遵循陣列子類別#
此行為模仿其他函式 (例如 np.diagonal
) 的行為,並確保例如對於遮罩陣列,np.trace(ma)
和 ma.trace()
給出相同的結果。
np.dot
現在引發 TypeError
而不是 ValueError
#
此行為模仿其他函式 (例如 np.inner
) 的行為。如果兩個引數無法轉換為通用型別,則可能會根據其順序引發 TypeError
或 ValueError
。現在,np.dot
現在將始終引發 TypeError
。
linalg.norm
傳回型別變更#
linalg.norm
函式現在以浮點數執行所有計算並傳回浮點數結果。此變更修正了由於整數溢位以及帶符號整數最小值 (例如 int8(-128)) 的 abs 失敗而導致的錯誤。為了保持一致性,即使在整數可能有效的情況下也使用浮點數。
棄用#
Fortran 順序陣列的檢視#
F_CONTIGUOUS 旗標用於表示使用會變更元素大小的 dtype 的檢視會變更第一個索引。對於同時為 F_CONTIGUOUS 和 C_CONTIGUOUS 的陣列,這始終是有問題的,因為 C_CONTIGUOUS 優先。寬鬆的 stride 檢查會導致更多此類雙重連續陣列,並因此破壞一些現有程式碼。請注意,這也會影響透過指派給陣列的 dtype 屬性來變更 dtype。此棄用的目的是在未來某個時間將檢視限制為 C_CONTIGUOUS 陣列。向後相容的解決方法是改為使用 a.T.view(...).T
。也可以將參數新增至 view 方法,以明確要求 Fortran 順序檢視,但這將不會向後相容。
陣列排序的無效引數#
目前可以為方法 (例如 array.flatten
或 array.ravel
) 中的 order
參數傳遞不是以下其中之一的引數:「C」、「F」、「A」、「K」(請注意,所有這些可能的值都是 Unicode 且不區分大小寫)。未來版本將不允許此類行為。
testing
命名空間中的隨機數字產生器#
Python 標準函式庫隨機數字產生器先前在 testing
命名空間中公開為 testing.rand
。不建議使用此產生器,並且將在未來版本中移除。請改為使用 numpy.random
命名空間中的產生器。
封閉區間上的隨機整數產生#
根據 Python C API (優先於半開區間而不是封閉區間),np.random.random_integers
已棄用,而改為呼叫 np.random.randint
,後者已使用「新功能」下所述的 dtype
參數進行增強。但是,np.random.random_integers
不會很快移除。
FutureWarnings#
指派給 MaskedArray
的切片/檢視#
目前,遮罩陣列的切片包含原始資料的檢視和遮罩的寫入時複製檢視。因此,對切片遮罩的任何變更都會導致建立原始遮罩的副本,並變更該新遮罩,而不是原始遮罩。例如,如果我們像這樣建立原始遮罩的切片,view = original[:]
,則對一個陣列中的資料進行修改將會影響另一個陣列的資料,但是由於遮罩將在指派運算期間複製,因此對遮罩的變更將保持在本機。當使用 MaskedArray(data, mask)
明確建構遮罩陣列時,也會發生類似的情況,傳回的陣列將包含 data
的檢視,但遮罩將是 mask
的寫入時複製檢視。
在未來,這些情況將會標準化,以便資料和遮罩陣列以相同的方式處理,並且對其中任一項的修改將在檢視之間傳播。在 1.11 中,當使用者程式碼修改未來可能會導致值傳播回原始值的檢視的遮罩時,numpy 將發出 MaskedArrayFutureWarning
警告。若要消除這些警告並使您的程式碼能夠抵抗即將發生的變更,您有兩個選項:如果您想要保留目前的行為,請在修改遮罩之前呼叫 masked_view.unshare_mask()
。如果您想要提早取得未來的行為,請使用 masked_view._sharedmask = False
。但是,請注意,設定 _sharedmask
屬性將會中斷後續對 masked_view.unshare_mask()
的明確呼叫。