验证 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
在您的虚拟环境中安装预构建的 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 开发人员,不止一个用户可以重现该问题。