验证 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.搭建虚拟环境#
创建一个新目录,进入其中,然后使用您喜欢的方法设置虚拟环境。例如,这是
virtualenv
在 Linux 或 macOS 上使用的方法:
virtualenv venv_np_bug
source venv_np_bug/bin/activate
这确保了系统/全局/默认的 Python/NumPy 安装不会被更改。
2. 安装报告bug的NumPy版本#
该报告引用了 NumPy 版本 1.18.4,因此在本例中您需要安装该版本。
由于此错误与版本相关,而不是特定提交,因此通过以下方式安装在虚拟环境中的预构建轮pip
就足够了:
pip install numpy==1.18.4
有些错误可能需要您构建问题报告中引用的 NumPy 版本。要了解如何执行此操作,请访问 从源代码构建。
1.重现错误#
#16354中报告的问题是dtype
,如果该方法的输入之一
numpy.polymul
是零数组,则会返回错误。
要重现该错误,请启动 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')
dtype
请注意,即使零数组是 的参数之一,现在也会返回正确的值numpy.polymul
。
5. 通过验证和修复bug来支持NumPy开发#
转到NumPy GitHub 问题页面 ,查看是否可以确认是否存在其他尚未确认的错误。特别是,对于开发人员来说,了解 bug 是否可以在较新版本的 NumPy 上重现非常有用。
验证错误是否存在的评论提醒 NumPy 开发人员,多个用户可以重现该问题。