验证 NumPy 中的错误和错误修复#

在本操作指南中,您将学习如何

  • 验证 NumPy 中是否存在错误

  • 验证针对该错误所做的修复(如果有)

在您完成验证流程的同时,您还将学习如何

  • 设置 Python 虚拟环境(使用 virtualenv

  • 安装适当版本的 NumPy,首先查看错误的行为,然后验证其修复

问题 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 安装在您的虚拟环境中的预构建轮文件就足够了

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 开发人员,不止一个用户可以复制该问题。