NumPy 1.14.0 发布说明#

Numpy 1.14.0 是七个月工作的成果,包含大量错误修复和新功能,以及一些具有潜在兼容性问题的更改.用户会注意到的主要变化是 numpy 数组和标量打印方式的样式变化,这种变化会影响 doctest.有关在需要时如何保留旧样式打印的详细信息,请参见下文.

一个影响未来发展的主要决定是关于在 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 , fromregexsavetxt 现在可以处理具有任意 Python 支持编码的文件.

  • NumPy 数组和标量打印的重大改进.

新函数#

  • parametrize :添加到 numpy.testing 的装饰器

  • chebinterpolate :在 Chebyshev 点插值函数.

  • format_float_positionalformat_float_scientific :明确地格式化浮点标量,并控制舍入和填充.

  • PyArray_ResolveWritebackIfCopyPyArray_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 .

  • 不推荐使用 minlength=None 调用 np.bincount .应该使用 minlength=0 代替.

  • 不推荐使用 sep 参数的默认值调用 np.fromstring .当未提供该参数时,将使用 np.frombuffer 的损坏版本,该版本会默默地接受 unicode 字符串,并在将它们编码为 utf-8 (python 3) 或默认编码 (python 2) 后,将它们视为二进制数据.如果需要读取二进制数据,应直接使用 np.frombuffer .

  • 在非旧版打印模式下,不推荐使用 array2string 的 style 选项.

  • PyArray_SetUpdateIfCopyBase 已被弃用.对于 NumPy 版本 >= 1.14,请改用 PyArray_SetWritebackIfCopyBase ,有关更多详细信息,请参见下面的 C API changes .

  • 不推荐使用 UPDATEIFCOPY 数组,有关详细信息,请参见下面的 C API changes .我们将不会放弃对这些数组的支持,但是它们与 PyPy 不兼容.

未来变化#

  • np.issubdtype 将停止向下转换类似 dtype 的参数.可能期望 issubdtype(np.float32, 'float64')issubdtype(np.float32, np.float64) 具有相同的含义 - 然而,存在一个未记录的特殊情况,将前者转换为 issubdtype(np.float32, np.floating) ,从而产生令人惊讶的 True 结果.

    此转换现在会发出警告,解释发生了什么转换.将来,该转换将被禁用,并且第一个示例将等同于第二个.

  • np.linalg.lstsqrcond 默认值将被更改. np.linalg.lstsqrcond 参数将更改其默认值为机器精度乘以输入数组维度的最大值.当未显式传递 rcond 时,会发出 FutureWarning.

  • a 是非连续的时, a.flat.__array__() 将返回 a 的可写副本.之前,当 a 可写时,它返回一个 UPDATEIFCOPY 数组.目前它返回一个不可写的副本.有关此问题的讨论,请参见 gh-7054.

  • 非结构化 void 数组的 .item 方法将返回一个 bytes 对象.将来,在 np.void 数据类型的数组或标量上调用 .item() 将返回一个 bytes 对象,而不是缓冲区或 int 数组,这与 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

产生 fill_valuenp.ma 函数已更改.#

以前, np.ma.default_fill_value 将返回一个 0d 数组,但 np.ma.minimum_fill_valuenp.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 是非连续的时, a.flat.__array__() 返回不可写的数组.#

目的是,当 a 是非连续时,之前返回的 UPDATEIFCOPY 数组将在将来被可写副本替换.此临时措施旨在通知那些期望在这种情况下修改底层数组的人,这种情况将不再发生.最有可能注意到这种情况的地方是使用 np.asarray(a.flat) 形式的表达式时,或者当 a.flat 作为 out 参数传递给 ufunc 时.

现在,当收缩长度为 0 的维度时, np.tensordot 返回零数组.#

以前,当收缩长度为 0 的维度时, np.tensordot 引发 ValueError.现在,它返回一个零数组,这与 np.dotnp.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

此更改仅影响 float32float16 数组.

count_nonzero(arr, axis=()) 现在统计没有轴的情况,而不是所有轴#

在其他地方, axis==() 总是被理解为"没有轴",但 count_nonzero 有一个特殊情况,将其视为"所有轴".这是不一致且令人惊讶的.统计所有轴的正确方法一直是传递 axis == None .

__init__.py 文件已添加到测试目录#

这是为了在不同目录中存在重复的测试文件名时,与 pytest 兼容.因此, run_module_suite 不再有效,即 python <path-to-test-file> 会导致错误.

非结构化 void 数组上的 .astype(bool) 现在对每个元素调用 bool#

在 Python 2 上, void_array.astype(bool) 将始终返回一个 True 数组,除非 dtype 是 V0 .在 Python 3 上,此操作通常会崩溃.展望未来, astype 匹配 bool(np.void) 的行为,将所有零的缓冲区视为 false,将其他任何内容视为 true.仍然可以使用 arr.dtype.itemsize == 0 来检查 V0 .

MaskedArray.squeeze 永远不会返回 np.ma.masked#

np.squeeze 文档说明会返回一个视图,但 masked 变体有时会返回 masked ,这不是一个视图.已经修复了此问题,因此结果始终是原始 masked 数组的视图.这会破坏任何使用 masked_arr.squeeze() is np.ma.masked 的代码,但修复了写入 squeeze() 结果的代码.

can_cast 的第一个参数从 from 重命名为 from_#

之前的参数名 from 是 Python 中的保留关键字,这使得按名称传递参数变得困难.通过将参数重命名为 from_ 解决了这个问题.

当传递错误的类型时, isnat 引发 TypeError#

当未传递 datetimetimedelta 类型的变量时,ufunc isnat 过去会引发 ValueError .这已更改为引发 TypeError .

当传递错误的类型时, dtype.__getitem__ 引发 TypeError#

当使用浮点数进行索引时,dtype 对象过去会引发 ValueError .

用户定义的类型现在需要实现 __str____repr__#

以前,用户定义的类型可以回退到 numpy 中实现的 __str____repr__ 的默认实现,但现在已将其删除.现在,用户定义的类型将回退到 python 默认的 object.__str__object.__repr__ .

数组打印的许多更改,可以使用新的"旧式"打印模式禁用#

ndarray 和 numpy 标量的 strrepr 已通过多种方式进行了更改.这些更改可能会破坏下游用户的 doctest.

可以通过启用新的 1.13 "旧式"打印模式来禁用这些新行为,以主要重现 numpy 1.13 的行为.可以通过调用 np.set_printoptions(legacy="1.13") 或使用 np.array2string 的新 legacy 参数来启用此功能,例如 np.array2string(arr, legacy='1.13') .

总而言之,主要变化是:

  • 对于浮点类型:

    • float 数组的 repr 通常会省略之前在符号位置打印的空格.请参阅 np.set_printoptions 的新 sign 选项.

    • 浮点数组和标量使用一种新的十进制表示算法,给出最短的唯一表示.这通常会缩短 float16 小数输出,有时会缩短 float32float128 输出. float64 应该不受影响.请参阅 np.set_printoptions 的新 floatmode 选项.

    • 以科学计数法打印的 Float 数组不再使用固定精度,而是显示最短的唯一表示.

    • 浮点标量的 str 不再在 python2 中截断.

  • 对于其他数据类型:

    • 非有限复数标量打印为 nanj 而不是 nanj .

    • datetime 数组中的 NaT 值现在已正确对齐.

    • np.void 数据类型的数组和标量现在使用十六进制表示法打印.

  • 对于换行:

    • 如果数组输出的最后一行没有足够的空间,ndarray reprs 的 “dtype” 部分现在将被打印在下一行.

    • linewidth 格式选项现在始终有效.数组的 reprstr 永远不会超过这个值,除非单个元素太宽.

    • 数组字符串的最后一行永远不会比前面的行有更多的元素.

    • 如果元素太宽,则不会在第一行插入额外的空格.

  • 对于摘要(使用 ... 缩短长数组):

    • 不再为 str 插入尾随逗号.以前, str(np.arange(1001)) 给出 '[   0    1    2 ...,  998  999 1000]' ,它有一个额外的逗号.

    • 对于 2-D 及以上的数组,当 ... 单独打印在一行上以便摘要除了最后一个轴之外的任何轴时,换行符现在会附加到该行以匹配其前导换行符,并且删除尾随空格字符.

  • MaskedArray 数组现在使用逗号分隔打印的元素,始终打印 dtype,并正确地将长数组的元素换行到多行.如果有多于 1 个维度,数组属性现在以新的"左对齐"打印样式打印.

  • recarray 数组不再在其 dtype 之前打印尾随空格,并换行到正确数量的列.

  • 0d 数组不再有它们自己特殊的 strrepr 实现. np.array2stringstyle 参数已被弃用.

  • bool 数据类型的数组将在 repr 中省略数据类型.

  • 用户定义的 dtypes ( np.generic 的子类) 现在需要实现 __str____repr__ .

这些更改中的一些在下面有更详细的描述.如果您需要为 doctest 或其他原因保留以前的行为,您可能需要执行以下操作:

# FIXME: We need the str/repr formatting used in Numpy < 1.14.
try:
    np.set_printoptions(legacy='1.13')
except TypeError:
    pass

C API 变更#

UPDATEIFCOPY 数组兼容的 PyPy 替代方案#

UPDATEIFCOPY 数组是现有数组的连续副本,可能具有不同的维度,当它们的引用计数变为零并被释放时,其内容会被复制回原始数组. 由于 PyPy 不使用引用计数,因此它们不能与 PyPy 正确工作. NumPy 正在内部消除它们的使用,并且添加了两个新的 C-API 函数,

  • PyArray_SetWritebackIfCopyBase

  • PyArray_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 , fromregexsavetxt 现在可以通过 encoding 参数处理 Python 支持的任意编码的文件. 为了向后兼容,该参数默认为特殊的 bytes 值,该值继续将文本视为原始字节值,并继续将 latin1 编码的字节传递给自定义转换器. 使用任何其他值(包括 None 表示系统默认值)会将函数切换到真正的文本 IO,因此您将在生成的数组中收到 unicode 字符串而不是字节.

外部 nose 插件可被 numpy.testing.Tester 使用#

numpy.testing.Tester 现在可以识别 nose 内置插件之外的插件. 这允许使用例如 nose-timer 像这样: np.test(extra_argv=['--with-timer', '--timer-top-n', '20']) 来获得 20 个最慢测试的运行时. 还有一个额外的关键字 timer 添加到 Tester.test ,所以 np.test(timer=20) 也会报告 20 个最慢的测试.

parametrize 装饰器添加到 numpy.testing#

numpy.testing 中现在提供了一个基本的 parametrize 装饰器. 它旨在允许重写 pytest 中已弃用的基于 yield 的测试,以便于将来过渡到 pytest . nose 测试框架已经有好几年没有得到支持了,而且看起来像是放弃维护了.

新的 parametrize 装饰器不具备 pytest 中装饰器的全部功能. 它不适用于类,不支持嵌套,并且不替换变量名. 即便如此,它也应该足以重写 NumPy 测试.

chebinterpolate 函数已添加到 numpy.polynomial.chebyshev#

新的 chebinterpolate 函数在第一类切比雪夫点处插值给定的函数. 新的 Chebyshev.interpolate 类方法增加了对使用缩放和平移的第一类切比雪夫点在任意区间上进行插值的支持.

支持在 Python 3 中读取 lzma 压缩的文本文件#

对于包含 lzma 模块的 Python 版本,文本 IO 函数现在可以透明地从带有 xzlzma 扩展名的文件读取.

sign 选项已添加到 np.setprintoptionsnp.array2string#

此选项控制浮点类型的符号打印,可以是字符 ‘-’, ‘+’ 或 ‘ ‘ 之一. 使用 ‘+’,numpy 始终打印正值的符号,使用 ‘ ‘,它始终在正值的符号位置打印一个空格(空白字符),使用 ‘-‘,它将省略正值的符号字符. 新的默认值为 ‘-‘.

相对于 numpy 1.13,这个新的默认值改变了浮点输出. 旧的行为可以在 1.13 的 “legacy” 打印模式下获得,请参见上面的兼容性说明.

hermitian 选项已添加到 np.linalg.matrix_rank#

新的 hermitian 选项允许在基于标准 SVD 的矩阵秩计算和更高效的基于特征值的方法(用于对称/ Hermitian 矩阵)之间进行选择.

thresholdedgeitems 选项已添加到 np.array2string#

这些选项以前可以使用 np.set_printoptions 控制,但现在可以作为 np.array2string 的参数,在每次调用时进行更改.

concatenatestack 获得了 out 参数#

现在可以将所需 dtype 的预分配缓冲区用于这些函数的输出.

支持 Windows 上的 PGI flang 编译器#

PGI flang 编译器是 NVIDIA 在 Apache 2 许可下发布的 LLVM 的 Fortran 前端. 可以通过以下方式调用它:

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.savenpy 格式保存 NumPy 数组时,会在数组数据之前插入填充,使其与 64 字节对齐. 之前只有 16 字节(并且由于版本 2 中的代码错误,有时甚至更少). 现在对齐为 64 字节,这与最常用的 SIMD 指令集相匹配,并且也是最常见的缓存行大小. 这使得 npy 文件更容易在通过 mmap 打开它们的程序中使用,尤其是在 Linux 上, mmap 偏移量必须是页面大小的倍数.

现在可以不用临时文件写入 NPZ 文件了#

在 Python 3.6+ 中, numpy.saveznumpy.savez_compressed 现在直接写入 ZIP 文件,而无需创建中间临时文件.

更好地支持空的结构化和字符串类型#

结构化类型可以包含零个字段,字符串 dtypes 可以包含零个字符. 零长度字符串仍然不能直接创建,必须通过结构化 dtypes 构建:

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 位)的 strrepr 现在被打印为给出最短的十进制表示,该表示唯一地标识了相同类型的其他值. 以前这只适用于 float64 值. 其余的浮点类型现在通常比 numpy 1.13 中的更短. 以科学计数法打印的数组现在也使用最短的科学表示法,而不是像以前那样使用固定精度.

此外,与 python2 的 float s 不同,float 标量的 str 将不再在 python2 中被截断. np.double 标量现在具有与 python3 float 相同的 strrepr .

提供了新的函数 np.format_float_scientificnp.format_float_positional 来生成这些十进制表示.

np.set_printoptionsnp.array2string 中添加了一个新的选项 floatmode ,用于控制数组中打印元素的唯一性和舍入. 新的默认值是 floatmode='maxprec' ,其中 precision=8 ,这将最多打印 8 个小数位,或者如果一个元素可以用更少的位数唯一表示,则打印更少的小数位. 一个有用的新模式是 floatmode="unique" ,它将输出足够的位数来唯一地指定数组元素.

具有像 infjnanj 这样的值的 Numpy 复数浮点标量现在打印为 infjnanj ,就像纯 python 的 complex 类型一样.

FloatFormatLongFloatFormat 类已弃用,应替换为 FloatingFormat . 类似地, ComplexFormatLongComplexFormat 应替换为 ComplexFloatingFormat .

void 数据类型元素现在以十六进制表示法打印#

现在为非结构化的 np.void 元素(例如, V4 数据类型)打印与 python bytes 类型兼容的十六进制表示. 以前,在 python2 中,元素的原始 void 数据被打印到 stdout,或者在 python3 中,显示整数字节值.

现在可以独立自定义 void 数据类型的打印样式#

现在可以使用 np.set_printoptionsformatter 参数(使用 'void' 键,而不是像以前那样使用 catch-all numpystr 键)独立自定义 np.void 数组的打印样式.

减少了 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 中很危险,因为在这些版本中 dict 键的顺序不会被保留.

从结构化数组到布尔数组的赋值现在会引发 ValueError,这与 1.13 不同,在 1.13 中,它总是将目标元素设置为 True .

从具有多个字段的结构化数组到非结构化数组的赋值现在会引发 ValueError.在 1.13 中,这仅将源的第一个字段复制到目标.

现在不允许在多字段索引中使用字段"标题",也不允许在多字段索引中重复字段名称.

用户指南中有关结构化数组的文档已进行了重大更新,以反映这些更改.

Integer 和 Void 标量现在不受 np.set_string_function 的影响#

以前,与大多数其他 numpy 标量不同,整数和 void 标量的 strrepr 可以由 np.set_string_function 控制.现在不再可能.

0d 数组打印已更改, style arg of array2string 已弃用#

以前,0d 数组的 strrepr 具有特殊的实现,对于 0d 数组 a ,分别返回 str(a.item())'array(' + repr(a.item()) + ')' ,这与 numpy 标量和更高维度的 ndarray 不同.

现在,0d 数组的 str 像使用 str(a[()]) 的 numpy 标量一样工作, repr 像使用 formatter(a[()]) 的更高维度数组一样工作,其中 formatter 可以使用 np.set_printoptions 指定. np.array2stringstyle 参数已弃用.

这种新行为在 1.13 遗留打印模式下被禁用,请参阅上面的兼容性说明.

使用数组播种 RandomState 需要一维数组#

RandomState 之前会接受空数组或具有 2 个或更多维度的数组,这会导致无法播种(空数组)或在设置种子时忽略某些传递的值.

MaskedArray 对象显示更有用的 repr#

MaskedArrayrepr 现在更接近于生成它的 python 代码,数组现在显示逗号和 dtypes.与其他格式更改一样,可以使用 1.13 遗留打印模式禁用此功能,以便帮助转换 doctests.

np.polynomial 类的 repr 更加明确#

它现在将域和窗口参数显示为关键字参数,以使它们更清晰:

>>> np.polynomial.Polynomial(range(4))
Polynomial([0.,  1.,  2.,  3.], domain=[-1,  1], window=[-1,  1])