驗證 NumPy 中的錯誤和錯誤修復#
在本操作指南中,您將學習如何
驗證 NumPy 中錯誤的存在
驗證針對該錯誤所做的修復(如果有的話)
在您逐步完成驗證過程時,您將學習如何
設定 Python 虛擬環境(使用
virtualenv
)安裝適當版本的 NumPy,首先查看錯誤的實際情況,然後驗證其修復
Issue 16354 用作範例。
此問題是
標題:當給定全零引數時,np.polymul 傳回型別為 np.float64 或 np.complex128
當一個引數全為零,且兩個引數的型別為 np.int64 或 np.float32 時,np.polymul 會傳回型別為 np.float64 的物件。當全為零的 np.complex64 給出 np.complex128 的結果型別時,也會發生類似情況。
非零引數不會發生這種情況;在這種情況下,結果如預期。
np.convolve 中不存在此錯誤。
重現程式碼範例:
>>> import numpy as np >>> np.__version__ '1.18.4' >>> a = np.array([1,2,3]) >>> z = np.array([0,0,0]) >>> np.polymul(a.astype(np.int64), a.astype(np.int64)).dtype dtype('int64') >>> np.polymul(a.astype(np.int64), z.astype(np.int64)).dtype dtype('float64') >>> np.polymul(a.astype(np.float32), z.astype(np.float32)).dtype dtype('float64') >>> np.polymul(a.astype(np.complex64), z.astype(np.complex64)).dtype dtype('complex128') Numpy/Python version information: >>> import sys, numpy; print(numpy.__version__, sys.version) 1.18.4 3.7.5 (default, Nov 7 2019, 10:50:52) [GCC 8.3.0]
1. 設定虛擬環境#
建立一個新目錄,進入該目錄,並使用您偏好的方法設定虛擬環境。例如,以下是如何在 linux 或 macOS 上使用 virtualenv
執行此操作
virtualenv venv_np_bug
source venv_np_bug/bin/activate
這確保了系統/全域/預設的 Python/NumPy 安裝不會被更改。
2. 安裝報告錯誤的 NumPy 版本#
該報告參考了 NumPy 版本 1.18.4,因此這是您在此案例中需要安裝的版本。
由於此錯誤與發行版本而非特定提交相關,因此透過 pip
安裝在您的虛擬環境中的預先建置 wheel 即可滿足需求
pip install numpy==1.18.4
某些錯誤可能需要您建置問題報告中參考的 NumPy 版本。若要了解如何執行此操作,請造訪 從原始碼建置。
3. 重現錯誤#
#16354 中報告的問題是,如果方法 numpy.polymul
的輸入之一是零陣列,則會傳回錯誤的 dtype
。
若要重現錯誤,請啟動 Python 終端機,輸入錯誤報告中顯示的程式碼片段,並確保結果與問題中的結果相符
>>> import numpy as np
>>> np.__version__
'...' # 1.18.4
>>> a = np.array([1,2,3])
>>> z = np.array([0,0,0])
>>> np.polymul(a.astype(np.int64), a.astype(np.int64)).dtype
dtype('int64')
>>> np.polymul(a.astype(np.int64), z.astype(np.int64)).dtype
dtype('...') # float64
>>> np.polymul(a.astype(np.float32), z.astype(np.float32)).dtype
dtype('...') # float64
>>> np.polymul(a.astype(np.complex64), z.astype(np.complex64)).dtype
dtype('...') # complex128
如報告所述,每當範例中的零陣列 z
是 numpy.polymul
的引數之一時,都會傳回不正確的 dtype
。
4. 檢查最新 NumPy 版本中的修復#
如果您的錯誤問題報告尚未解決,則需要提交進一步的行動或修補程式。
然而,在本案例中,問題已由 PR 17577 解決,現在已關閉。因此您可以嘗試驗證修復。
若要驗證修復
解除安裝錯誤仍然存在的 NumPy 版本
pip uninstall numpy
安裝最新版本的 NumPy
pip install numpy
在您的 Python 終端機中,執行您用來驗證錯誤存在的報告程式碼片段,並確認問題已解決
>>> import numpy as np >>> np.__version__ '...' # 1.18.4 >>> a = np.array([1,2,3]) >>> z = np.array([0,0,0]) >>> np.polymul(a.astype(np.int64), a.astype(np.int64)).dtype dtype('int64') >>> np.polymul(a.astype(np.int64), z.astype(np.int64)).dtype dtype('int64') >>> np.polymul(a.astype(np.float32), z.astype(np.float32)).dtype dtype('float32') >>> np.polymul(a.astype(np.complex64), z.astype(np.complex64)).dtype dtype('complex64')
請注意,即使零陣列是 numpy.polymul
的引數之一,現在也會傳回正確的 dtype
。
5. 透過驗證和修復錯誤來支援 NumPy 開發#
前往 NumPy GitHub 問題頁面,看看您是否可以確認任何其他尚未確認的錯誤的存在。特別是,讓開發人員知道是否可以在較新版本的 NumPy 上重現錯誤非常有用。
驗證錯誤存在的評論會提醒 NumPy 開發人員,有多位使用者可以重現該問題。