在 NumPy 中验证错误和错误修复#
在这篇操作指南中,您将学习如何:
验证NumPy中一个错误的存在
验证为该错误所做的任何修复
当你走过验证过程时,你将学会如何:
设置一个 Python 虚拟环境(使用
virtualenv
)首先安装适当版本的 NumPy,以查看错误的表现,然后验证其修复
Issue 16354 被用作一个例子.
这个问题是:
标题: 当给定全零参数时,np.polymul 返回类型为 np.float64 或 np.complex128
np.polymul 当一个参数全为零且两个参数类型均为 np.int64 或 np.float32 时,返回一个类型为 np.float64 的对象.类似的情况发生在全零的 np.complex64 给出结果类型 np.complex128 时.
对于非零参数,这种情况不会发生;结果是预期的.
这个bug在np.convolve中不存在.
Reproducing code example:
>>> 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 开发者,不止一个用户可以重现这个问题.