NumPy 1.14.0 发布说明#
Numpy 1.14.0 是七个月工作的成果,包含大量错误修复和新功能,以及一些可能影响兼容性的更改.用户会注意到的主要变化是 numpy 数组和标量打印方式的风格变化,这一变化将影响 doctests.有关如何在需要时保留旧的打印风格的详细信息,请参见下文.
影响未来开发的一个重大决策是关于在2020年之前逐步放弃对Python 2.7支持的时间表.决定在2018年发布的所有版本中继续支持2.7,最后一个版本被指定为长期支持版本,其错误修复支持将延续到2019年.在2019年,所有新版本中将放弃对2.7的支持.更多细节可以在 NEP 12 中找到.
此版本支持 Python 2.7 和 3.4 - 3.6.
亮点#
np.einsum 函数在可能的情况下使用 BLAS
genfromtxt、loadtxt、fromregex和savetxt现在可以处理任意 Python 支持编码的文件.对NumPy数组和标量打印的主要改进.
新功能#
parametrize: 添加到 numpy.testing 的装饰器chebinterpolate: 在切比雪夫点处插值函数.format_float_positional和format_float_scientific: 以明确的控制舍入和填充格式化浮点标量.PyArray_ResolveWritebackIfCopy和PyArray_SetWritebackIfCopyBase,新的 C-API 函数,有助于实现 PyPy 兼容性.
弃用#
使用
np.bool_对象代替整数已被弃用.以前operator.index(np.bool_)是合法的,并允许构造如[1, 2, 3][np.True_].这是误导性的,因为它与np.array([1, 2, 3])[np.True_]的行为不同.检测空数组的真值测试已被弃用.要检查数组是否不为空,请使用
array.size > 0.调用
np.bincount时使用minlength=None已被弃用.应使用minlength=0代替.调用
np.fromstring时,使用sep参数的默认值已被弃用.当未提供该参数时,会使用一个损坏版本的np.frombuffer,它会静默接受unicode字符串,并将它们编码为utf-8(python 3)或默认编码(python 2)后,将它们视为二进制数据.如果需要读取二进制数据,应直接使用np.frombuffer.在非传统打印模式下,array2string 的
style选项已被弃用.PyArray_SetUpdateIfCopyBase已被弃用.对于 NumPy 版本 >= 1.14,请改用PyArray_SetWritebackIfCopyBase,更多详情请参见下面的 C API 更改.UPDATEIFCOPY数组的使用已被弃用,详情请参见下面的 C API 变更.我们不会放弃对这些数组的支持,但它们与 PyPy 不兼容.
未来变化#
np.issubdtype将停止向下转换类似 dtype 的参数.可能会预期issubdtype(np.float32, 'float64')和issubdtype(np.float32, np.float64)意味着同样的事情 - 然而,存在一个未记录的特殊情况,将前者转换为issubdtype(np.float32, np.floating),给出了令人惊讶的 True 结果.这个翻译现在给出了一个警告,解释了正在进行的翻译.在未来,翻译将被禁用,第一个示例将与第二个等效.
np.linalg.lstsq的rcond默认值将会改变.``np.linalg.lstsq`` 的rcond参数将默认改为机器精度乘以输入数组维度的最大值.当rcond未明确传递时,会发出一个 FutureWarning.a.flat.__array__()当a是非连续时,将返回a的可写副本.之前,当a是可写时,它返回一个 UPDATEIFCOPY 数组.目前,它返回一个不可写副本.有关该问题的讨论,请参见 gh-7054.非结构化空数组的
.item方法将返回一个字节对象.在未来,在np.void数据类型的数组或标量上调用.item()将返回一个bytes对象,而不是缓冲区或整数数组,这与bytes(void_scalar)返回的结果相同.这可能会影响假设返回值是可变的代码,因为这种情况将不再存在.现在,当这种情况发生时,会发出一个FutureWarning.
兼容性说明#
掩码数组视图的掩码也是一个视图,而不是一个副本#
在NumPy 1.11.x中,关于这一变化有一个FutureWarning.简而言之,现在的情况是,当改变掩码数组的视图时,对掩码的更改会传播到原始数组.这在以前不是这种情况.这一变化尤其影响切片.请注意,如果原始数组的掩码是``nomask``,而视图的掩码被改变,这还不能正常工作.有关扩展讨论,请参见gh-5580.通过调用视图的``unshare_mask``方法,可以获得掩码副本的原始行为.
np.ma.masked 不再可写#
尝试修改 masked 常量现在会报错,因为底层数组被标记为只读.过去,这样做是可能的:
# emulating a function that sometimes returns np.ma.masked
val = random.choice([np.ma.masked, 10])
var_arr = np.asarray(val)
val_arr += 1 # now errors, previously changed np.ma.masked.data
np.ma 生成 fill_value 的函数已更改#
之前,``np.ma.default_fill_value`` 会返回一个 0d 数组,但 np.ma.minimum_fill_value 和 np.ma.maximum_fill_value 会返回一个字段元组.相反,所有三种方法都返回一个结构化的 np.void 对象,这正是你会在 .fill_value 属性中已经找到的.
此外,现在 dtype 的猜测与 np.array 的匹配 - 因此当传递一个 python 标量 x 时,``maximum_fill_value(x)`` 总是与 maximum_fill_value(np.array(x)) 相同.以前在 Python 2 上 x = long(1) 违反了这个假设.
a.flat.__array__() 当 a 不是连续的时候返回不可写的数组#
意图是,当 a 不是连续的时候,之前返回的 UPDATEIFCOPY 数组将在未来被一个可写的副本替换.这一临时措施旨在通知那些期望在这种情况下修改底层数组的人,这种情况将不再发生.最有可能注意到这一点的地方是当使用 np.asarray(a.flat) 形式的表达式时,或者当 a.flat 作为 out 参数传递给 ufunc 时.
np.tensordot 现在在沿0长度维度收缩时返回零数组#
之前 np.tensordot 在沿0长度维度收缩时会引发 ValueError.现在它返回一个零数组,这与 np.dot 和 np.einsum 的行为一致.
numpy.testing 重新组织#
这预计不会引起问题,但可能有些东西被遗漏了.如果你在使用 numpy.testing 时遇到意外的导入问题,请告诉我们.
np.asfarray 不再通过 dtype 参数接受非 dtypes#
以前这会接受 dtype=some_array ,其隐含的语义是 dtype=some_array.dtype .这是未记录的,在 numpy 函数中是独一无二的,如果使用可能会对应于一个拼写错误.
1D np.linalg.norm 保留浮点输入类型,即使是任意阶数#
之前,当传递任意顺序时,这会提升到 float64,尽管在简单情况下不会这样做:
>>> f32 = np.float32([[1, 2]])
>>> np.linalg.norm(f32, 2.0, axis=-1).dtype
dtype('float32')
>>> np.linalg.norm(f32, 2.0001, axis=-1).dtype
dtype('float64') # numpy 1.13
dtype('float32') # numpy 1.14
此更改仅影响 float32 和 float16 数组.
count_nonzero(arr, axis=()) 现在不计算任何轴,而不是所有轴#
在其他地方,``axis==()`` 总是被理解为”没有轴”,但 count_nonzero 有一个特殊情况,将其视为”所有轴”.这是不一致且令人惊讶的.正确的做法一直是通过 axis == None 来计算所有轴.
__init__.py 文件添加到测试目录#
这是为了在不同目录中存在重复的测试文件名时保持pytest的兼容性.因此,``run_module_suite`` 不再工作,即 python <path-to-test-file> 会导致错误.
在非结构化空数组上调用 .astype(bool) 现在会对每个元素调用 bool#
在 Python 2 上,``void_array.astype(bool)`` 总是返回一个 True 的数组,除非 dtype 是 V0.在 Python 3 上,这个操作通常会崩溃.向前发展,`astype` 匹配 bool(np.void) 的行为,将所有零的缓冲区视为假,其他任何东西视为真.可以通过 arr.dtype.itemsize == 0 检查 V0.
MaskedArray.squeeze 永远不会返回 np.ma.masked#
np.squeeze 被记录为返回一个视图,但带掩码的变体有时会返回 masked,这不是一个视图.这个问题已经修复,因此结果始终是原始掩码数组的视图.这会破坏任何使用 masked_arr.squeeze() is np.ma.masked 的代码,但修复了写入 squeeze() 结果的代码.
将 can_cast 的第一个参数从 from 重命名为 from_#
之前的参数名 from 在 Python 中是保留关键字,这使得按名称传递参数变得困难.这已经通过将参数重命名为 from_ 来解决.
isnat 在传递错误类型时引发 TypeError#
当 isnat ufunc 没有传递 datetime 或 timedelta 类型的变量时,它过去会引发 ValueError.这一行为已更改为引发 TypeError.
dtype.__getitem__ 在传递错误类型时会引发 TypeError#
当使用浮点数索引时,使用的 dtype 对象会引发 ValueError.
用户定义的类型现在需要实现 __str__ 和 __repr__#
之前,用户定义的类型可以回退到在 numpy 中实现的 __str__ 和 __repr__ 的默认实现,但现在这已被移除.现在用户定义的类型将回退到 python 默认的 object.__str__ 和 object.__repr__.
对数组打印的许多更改,可以通过新的”传统”打印模式禁用#
str 和 repr 的 ndarrays 和 numpy 标量在多种方式上已经发生了变化.这些变化可能会破坏下游用户的 doctests.
这些新行为可以通过启用新的 1.13 “legacy” 打印模式来禁用,以大致重现 numpy 1.13 的行为.这可以通过调用 np.set_printoptions(legacy="1.13") 来启用,或者使用新的 legacy 参数到 np.array2string,如 np.array2string(arr, legacy='1.13').
总之,主要的变化是:
对于浮点类型:
浮点数数组的
repr通常会省略之前在符号位置打印的空间.请参见np.set_printoptions的新sign选项.浮点数数组和标量使用了一种新的十进制表示算法,给出了最短的唯一表示.这通常会缩短
float16小数部分的输出,有时也会缩短float32和float128的输出.``float64`` 应该不受影响.请参阅np.set_printoptions的新floatmode选项.以科学计数法打印的浮点数组不再使用固定精度,而是现在显示最短的唯一表示.
浮点标量的
str在 python2 中不再被截断.
对于其他数据类型:
非有限复数标量打印为
nanj而不是nan*j.NaT值在日期时间数组中现在已正确对齐.np.void数据类型的数组和标量现在使用十六进制表示法打印.
对于换行:
如果数组输出的最后一行没有空间,ndarray reprs 的 “dtype” 部分现在将打印在下一行.
linewidth格式选项现在总是被尊重.数组的 repr 或 str 永远不会超过这个值,除非单个元素太宽.数组字符串的最后一行永远不会比前面的行有更多的元素.
如果元素太宽,不再在第一行插入额外的空格.
对于摘要(使用
...来缩短长数组):对于
str,不再插入尾随逗号.以前,``str(np.arange(1001))`` 给出'[ 0 1 2 ..., 998 999 1000]',其中有一个额外的逗号.对于2维及以上的数组,当
...为了总结除最后一个轴之外的任何轴而在其自己的行上打印时,现在会在该行附加换行符以匹配其前导换行符,并删除尾随的空格字符.
MaskedArray数组现在用逗号分隔打印元素,总是打印dtype,并正确地将长数组的元素换行到多行.如果有超过1个维度,数组属性现在以新的”左对齐”打印样式打印.recarray数组在打印其 dtype 之前不再有尾随空格,并且会正确地换行到适当的列数.0d 数组不再有自己特有的
str和repr实现.``np.array2string`` 的style参数已被弃用.bool数据类型的数组将在repr中省略数据类型.用户定义的
dtypes``(``np.generic的子类)现在需要实现__str__和__repr__.
这些更改中的一些在下面有更详细的描述.如果你需要保留之前的doctests行为或其他原因,你可能想做类似的事情:
# FIXME: We need the str/repr formatting used in Numpy < 1.14.
try:
np.set_printoptions(legacy='1.13')
except TypeError:
pass
C API 变化#
PyPy 兼容的 UPDATEIFCOPY 数组的替代方案#
UPDATEIFCOPY 数组是现有数组的连续副本,可能具有不同的维度,当它们的引用计数变为零并被释放时,其内容会被复制回原始数组.因为 PyPy 不使用引用计数,它们在 PyPy 中无法正常工作.NumPy 正在内部逐步淘汰它们的使用,并引入了两个新的 C-API 函数,
PyArray_SetWritebackIfCopyBasePyArray_ResolveWritebackIfCopy,
已经添加了一个补充标志 NPY_ARRAY_WRITEBACKIFCOPY.使用新功能还要求在创建新数组时更改一些标志,即:NPY_ARRAY_INOUT_ARRAY 应替换为 NPY_ARRAY_INOUT_ARRAY2,``NPY_ARRAY_INOUT_FARRAY`` 应替换为 NPY_ARRAY_INOUT_FARRAY2.使用这些新标志创建的数组将具有 WRITEBACKIFCOPY 语义.
如果 PyPy 兼容性不是一个问题,可以忽略这些新函数,尽管会有一个 DeprecationWarning.如果你确实希望追求 PyPy 兼容性,可以在 c-api 文档和 how-to-extend 中的示例中找到有关这些函数及其使用的更多信息.
新功能#
文本IO函数的编码参数#
genfromtxt、loadtxt、fromregex 和 savetxt 现在可以通过 encoding 参数处理支持 Python 的任意编码文件.为了向后兼容,该参数默认值为特殊的 bytes 值,该值继续将文本视为原始字节值,并继续将 latin1 编码的字节传递给自定义转换器.使用任何其他值(包括 None 表示系统默认值)将切换函数为真正的文本 IO,因此在结果数组中会收到 unicode 字符串而不是字节.
外部 nose 插件可以通过 numpy.testing.Tester 使用#
numpy.testing.Tester 现在可以识别 nose 内置插件之外的 nose 插件.这允许使用例如 nose-timer ,如下所示: np.test(extra_argv=['--with-timer', '--timer-top-n', '20']) 以获取运行时间最长的20个测试.还为 Tester.test 添加了一个额外的关键字 timer ,因此 np.test(timer=20) 也将报告运行时间最长的20个测试.
parametrize 装饰器添加到 numpy.testing#
一个基本的 parametrize 装饰器现在在 numpy.testing 中可用.它的目的是允许重写已在 pytest 中弃用的基于 yield 的测试,以便在未来促进向 pytest 的过渡.nose 测试框架已经多年未得到支持,看起来像是被遗弃的软件.
新的 parametrize 装饰器不具备 pytest 中的完整功能.它不适用于类,不支持嵌套,也不替换变量名.尽管如此,它应该足以重写 NumPy 测试.
chebinterpolate 函数已添加到 numpy.polynomial.chebyshev#
新的 chebinterpolate 函数在第一类切比雪夫点处插值给定的函数.一个新的 Chebyshev.interpolate 类方法增加了对使用缩放和移位的第一类切比雪夫点在任意区间上进行插值的支持.
在Python 3中支持读取lzma压缩的文本文件#
使用包含 lzma 模块的 Python 版本,文本 IO 函数现在可以透明地读取具有 xz 或 lzma 扩展名的文件.
sign 选项已添加到 np.setprintoptions 和 np.array2string#
此选项控制浮点类型的符号打印,可以是字符 ‘-’, ‘+’ 或 ‘ ‘.使用 ‘+’ 时,numpy 总是打印正数值的符号,使用 ‘ ‘ 时,总是打印正数值符号位置的空格(空白字符),使用 ‘-’ 时,将省略正数值的符号字符.新的默认值是 ‘-‘.
这个新的默认设置改变了相对于 numpy 1.13 的浮点输出.在 1.13 的”遗留”打印模式下可以获得旧的行为,请参见上面的兼容性说明.
hermitian 选项已添加到 np.linalg.matrix_rank#
新的 hermitian 选项允许在基于标准SVD的矩阵秩计算和更高效的对称/厄米矩阵的基于特征值的方法之间进行选择.
threshold 和 edgeitems 选项已添加到 np.array2string#
这些选项以前可以通过 np.set_printoptions 控制,但现在可以作为 np.array2string 的参数在每次调用时更改.
concatenate 和 stack 获得了 out 参数#
现在可以使用所需 dtype 的预分配缓冲区作为这些函数的输出.
Windows 上对 PGI flang 编译器的支持#
PGI flang 编译器是一个由 NVIDIA 在 Apache 2 许可证下发布的 Fortran 前端,用于 LLVM.可以通过 :: 调用它.
python setup.py config --compiler=clang --fcompiler=flang install
对于这个新编译器的使用经验很少,因此来自使用者的任何反馈都将受到欢迎.
改进#
在 random.noncentral_f 中的分子自由度只需要是正的.#
在 NumPy 1.14.0 之前,分子自由度需要大于 1,但该分布对大于 0 的值有效,这是新的要求.
GIL 在所有 np.einsum 变体中被释放#
一些具有加速循环版本的特定循环结构在 NumPy 1.14.0 之前没有释放 GIL.这一疏忽已得到修正.
np.einsum 函数在可能的情况下会使用 BLAS,并且默认进行优化#
np.einsum 函数现在会在适当的时候调用 np.tensordot.因为 np.tensordot 在可能的情况下使用 BLAS,这将加快执行速度.默认情况下,``np.einsum`` 也会尝试优化,因为相对于潜在的速度提升,开销很小.
f2py 现在处理维度为0的数组#
f2py 现在允许分配维度为0的数组.这使得下游对边缘情况的处理更加一致.
numpy.distutils 支持同时使用 MSVC 和 mingw64-gfortran#
Numpy distutils 现在支持同时使用 Mingw64 gfortran 和 MSVC 编译器.这使得在 Windows 上生成包含 Fortran 代码的 Python 扩展模块成为可能,同时保持与 Python.org 分发的二进制文件的兼容性.并非所有用例都受支持,但大多数常见的将 Fortran 包装为 Python 的方法都是可行的.
在这种模式下的编译通常是自动启用的,可以通过 setup.py 的 --fcompiler 和 --compiler 选项来选择.此外,支持将 Fortran 代码链接到静态 OpenBLAS;默认情况下会查找与 gfortran 兼容的静态档案 openblas.a.
np.linalg.pinv 现在可以处理堆叠矩阵#
之前它被限制为单个二维数组.
numpy.save 将数据对齐到 64 字节而不是 16 字节#
使用 numpy.save 以 npy 格式保存 NumPy 数组时,会在数组数据前插入填充以将其对齐到 64 字节.之前这仅为 16 字节(有时由于版本 2 代码中的一个错误会更少).现在对齐为 64 字节,这与最常见的 SIMD 指令集匹配,也是最常见的缓存行大小.这使得 npy 文件在通过 mmap 打开的程序中更容易使用,尤其是在 Linux 上,``mmap`` 偏移量必须是页面大小的倍数.
现在可以不使用临时文件来写入NPZ文件#
在 Python 3.6+ 中,``numpy.savez`` 和 numpy.savez_compressed 现在直接写入 ZIP 文件,而不创建中间临时文件.
更好地支持空结构和字符串类型#
结构化类型可以包含零个字段,字符串数据类型可以包含零个字符.零长度字符串仍然不能直接创建,必须通过结构化数据类型构造:
str0 = np.empty(10, np.dtype([('v', str, N)]))['v']
void0 = np.empty(10, np.void)
一直以来都可以使用这些,但现在这些数组支持以下操作:
arr.sort()
arr.view(bytes)
arr.resize(…)
pickle.dumps(arr)
在 np.lib.financial 中对 decimal.Decimal 的支持#
除非另有说明,``financial`` 包中的所有函数现在都支持使用 decimal.Decimal 内置类型.
浮点数打印现在使用”dragon4”算法来获取最短的十进制表示#
浮点值(16、32、64 和 128 位)的 str 和 repr 现在打印为最短的十进制表示,该表示可以唯一地识别该值与其他相同类型的值.以前这仅适用于 float64 值.其余的浮点类型现在通常会比 numpy 1.13 中的短.以科学计数法打印的数组现在也使用最短的科学表示法,而不是像以前那样的固定精度.
此外,与 python2 的 float 不同,浮点标量的 str 在 python2 中将不再被截断.`np.double` 标量现在具有与 python3 浮点数相同的
str和repr.
提供了新函数 np.format_float_scientific 和 np.format_float_positional 来生成这些十进制表示.
一个新的选项 floatmode 已经被添加到 np.set_printoptions 和 np.array2string 中,它控制数组中打印元素的唯一性和舍入.新的默认值是 floatmode='maxprec' 并带有 precision=8,这将最多打印8位小数,或者如果元素可以用更少的位数唯一表示,则打印更少的位数.一个有用的新模式是 floatmode="unique",它将输出足够的位数以唯一指定数组元素.
具有 inf*j 或 nan*j 值的 Numpy 复数浮点标量现在打印为 infj 和 nanj,类似于纯 Python 的 complex 类型.
FloatFormat 和 LongFloatFormat 类已被弃用,应全部替换为 FloatingFormat.同样,``ComplexFormat`` 和 LongComplexFormat 应替换为 ComplexFloatingFormat.
void 数据类型元素现在以十六进制表示法打印#
现在,对于非结构化的 np.void 元素(例如 V4 数据类型),会打印出与 Python bytes 类型兼容的十六进制表示.以前,在 Python2 中会直接将元素的原始空数据打印到标准输出,而在 Python3 中则会显示整数字节值.
void 数据类型的打印样式现在可以独立自定义#
np.void 数组的打印样式现在可以通过 np.set_printoptions 的 formatter 参数独立自定义,使用 'void' 键,而不是像以前那样使用全能的 numpystr 键.
减少 np.loadtxt 的内存使用#
np.loadtxt 现在以块为单位读取文件,而不是一次性读取,这显著减少了大型文件的内存使用.
变化#
多字段索引/赋值结构化数组#
具有多个字段的结构化数组的索引和赋值在许多方面已经发生了变化,正如之前版本中所警告的那样.
首先,使用多个字段对结构化数组进行索引,例如 arr[['f1', 'f3']],返回的是原始数组的视图而不是副本.返回的视图将包含与原始数组中介入字段对应的额外填充字节,这与1.13中的副本不同,这将影响诸如 arr[['f1', 'f3']].view(newdtype) 这样的代码.
其次,结构化数组之间的赋值现在将”按位置”而不是”按字段名称”进行.目标的第N个字段将被设置为源的第N个字段,而不考虑字段名称,这与numpy 1.6到1.13版本中目标数组中的字段被设置为源数组中同名字段或如果源没有该字段则设置为0不同.
相应地,在计算 dtype 相等性时,结构化 dtypes 中的字段顺序现在很重要.例如,使用以下 dtypes
x = dtype({'names': ['A', 'B'], 'formats': ['i4', 'f4'], 'offsets': [0, 4]})
y = dtype({'names': ['B', 'A'], 'formats': ['f4', 'i4'], 'offsets': [4, 0]})
表达式 x == y 现在将返回 False ,与之前不同.这使得基于字典的 dtype 规范如 dtype({'a': ('i4', 0), 'b': ('f4', 4)}) 在 python < 3.6 中变得危险,因为在这些版本中字典键顺序未被保留.
从结构化数组赋值到布尔数组现在会引发 ValueError,不像在 1.13 中,它总是将目标元素设置为 True.
将具有多个字段的结构化数组分配给非结构化数组现在会引发 ValueError.在 1.13 中,这只会将源的第一个字段复制到目标.
在多字段索引中使用字段”titles”现在是不允许的,在多字段索引中重复字段名也是不允许的.
用户指南中结构化数组的文档已经显著更新,以反映这些变化.
整数和空标量现在不受 np.set_string_function 的影响#
之前,与其他大多数 numpy 标量不同,整数和空标量的 str 和 repr 可以通过 np.set_string_function 控制.这不再可能.
0d 数组打印更改,array2string 的 style 参数已弃用#
之前,0d 数组的 str 和 repr 有特殊的实现,对于 0d 数组 a,分别返回 str(a.item()) 和 'array(' + repr(a.item()) + ')',这与 numpy 标量和高维 ndarrays 不同.
现在,0d 数组的 str 使用 str(a[()]) 表现得像一个 numpy 标量,而 repr 使用 formatter(a[()]) 表现得像更高维度的数组,其中 formatter 可以使用 np.set_printoptions 指定.``np.array2string`` 的 style 参数已被弃用.
这种新行为在 1.13 遗留打印模式中被禁用,请参见上面的兼容性说明.
使用数组为 RandomState 播种需要一个一维数组#
RandomState 以前会接受空数组或多维数组,这会导致种子设置失败(空数组)或设置种子时忽略某些传递的值.
MaskedArray 对象显示一个更有用的 repr#
MaskedArray 的 repr 现在更接近于生成它的 Python 代码,数组现在用逗号和 dtypes 显示.与其他格式变化一样,这可以通过 1.13 旧版打印模式禁用来帮助过渡 doctests.
np.polynomial 类的 repr 更加显式#
现在它将域和窗口参数显示为关键字参数,以使它们更清晰:
>>> np.polynomial.Polynomial(range(4))
Polynomial([0., 1., 2., 3.], domain=[-1, 1], window=[-1, 1])