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,例如,在 reshapetake 和指定 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) 的行為。如果兩個引數無法轉換為通用型別,則可能會根據其順序引發 TypeErrorValueError。現在,np.dot 現在將始終引發 TypeError

FutureWarning 到變更的行為#

  • np.lib.split 中,結果中的空陣列始終具有維度 (0,),無論要分割的陣列的維度為何。此行為已變更,以便維度將會保留。自 NumPy 1.9 以來,此變更的 FutureWarning 已就位,但由於錯誤,有時不會引發警告,而且維度已經保留。

%// 運算子#

這些運算子分別使用 remainderfloor_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_returninner_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 現在也具有可花費更多精力來減少誤判的選項。

  • SkipTestKnownFailureException 例外類別在 numpy.testing 命名空間中公開。在測試函式中引發它們,以將測試標記為要略過,或將其標記為已知失敗。

  • f2py.compile 具有新的 extension 關鍵字參數,允許為產生的暫存檔指定 fortran 副檔名。例如,可以將檔案指定為 *.f90verbose 引數也會啟用,先前會忽略它。

  • 已將 dtype 參數新增至 np.random.randint。現在可以產生以下型別的隨機 ndarray

    • np.bool_,

    • np.int8np.uint8

    • np.int16np.uint16

    • np.int32np.uint32

    • np.int64np.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.arraynp.ma.core.asarray) 中正確處理 order 引數。

遮罩陣列的記憶體和速度改進#

現在使用 mask=True (或 mask=False) 建立遮罩陣列會使用 np.ones (或 np.zeros) 來建立遮罩,這樣速度更快,並避免了大量的記憶體峰值。已完成另一個最佳化,以避免在列印遮罩陣列時出現記憶體峰值和無用的計算。

ndarray.tofile 現在在 linux 上使用 fallocate#

此函式現在使用 fallocate 系統呼叫,在支援它的檔案系統上保留足夠的磁碟空間。

形式為 A.T @ AA @ A.T 的運算的最佳化#

先前,gemm BLAS 運算用於所有矩陣乘積。現在,如果矩陣乘積是在矩陣及其轉置之間,它將使用 syrk BLAS 運算來提高效能。此最佳化已擴充到 @numpy.dotnumpy.innernumpy.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) 的行為。如果兩個引數無法轉換為通用型別,則可能會根據其順序引發 TypeErrorValueError。現在,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.flattenarray.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() 的明確呼叫。