驗證 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

如報告所述,每當範例中的零陣列 znumpy.polymul 的引數之一時,都會傳回不正確的 dtype

4. 檢查最新 NumPy 版本中的修復#

如果您的錯誤問題報告尚未解決,則需要提交進一步的行動或修補程式。

然而,在本案例中,問題已由 PR 17577 解決,現在已關閉。因此您可以嘗試驗證修復。

若要驗證修復

  1. 解除安裝錯誤仍然存在的 NumPy 版本

    pip uninstall numpy
    
  2. 安裝最新版本的 NumPy

    pip install numpy
    
  3. 在您的 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 開發人員,有多位使用者可以重現該問題。