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

  • genfromtxtloadtxtfromregexsavetxt 现在可以处理具有任意 Python 支持编码的文件。

  • 对 NumPy 数组和标量的打印进行了重大改进。

新函数#

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

  • chebinterpolate:在切比雪夫点处插值函数。

  • 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 更改

  • 不推荐使用 UPDATEIFCOPY 数组,有关详细信息,请参见下面的 C API 更改。我们将不会放弃对这些数组的支持,但它们与 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

np.ma 生成 fill_value 的函数已更改#

以前,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 作为 ufunc 的 out 参数传递时。

当收缩 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 <测试文件路径> 会导致错误。

现在对非结构化 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')

总而言之,主要更改是

  • 对于浮点类型

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

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

    • 以科学计数法打印的浮点数组不再使用固定精度,现在显示最短的唯一表示形式。

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

  • 对于其他数据类型

    • 非有限复数标量打印为 nanj 而不是 nan*j

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

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

  • 对于换行

    • 如果数组输出的最后一行没有空间,则 ndarray repr 的“dtype”部分现在将打印在下一行。

    • 现在始终遵守 linewidth 格式选项。除非单个元素太宽,否则数组的 reprstr 将永远不会超过此值。

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

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

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

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

    • 对于 2-D 及以上的数组,当 ... 被打印在它自己的行上,以便总结除最后一个轴之外的任何轴时,现在会在该行附加换行符以匹配其前导换行符并删除尾随空格字符。

  • 现在,MaskedArray 数组在打印元素时使用逗号分隔,始终打印 dtype,并能正确地将长数组的元素换行显示。如果数组的维度超过 1,现在将使用新的“左对齐”打印样式来打印数组属性。

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

  • 0 维数组不再有其自己特有的 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 更改#

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

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

  • PyArray_SetWritebackIfCopyBase

  • PyArray_ResolveWritebackIfCopy,

以及一个互补标志 NPY_ARRAY_WRITEBACKIFCOPY。使用新功能还需要在创建新数组时更改一些标志,即:NPY_ARRAY_INOUT_ARRAY 应替换为 NPY_ARRAY_INOUT_ARRAY2NPY_ARRAY_INOUT_FARRAY 应替换为 NPY_ARRAY_INOUT_FARRAY2。使用这些新标志创建的数组将具有 WRITEBACKIFCOPY 语义。

如果 PyPy 兼容性不是问题,则可以忽略这些新函数,尽管会有一个 DeprecationWarning。如果您希望追求 PyPy 兼容性,可以在 c-api 文档和 how-to-extend 中的示例中找到有关这些函数及其用法的更多信息。

新特性#

文本 IO 函数的 encoding 参数#

genfromtxtloadtxtfromregexsavetxt 现在可以通过 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 个最慢测试的运行时间。还向 Tester.test 添加了一个额外的关键字 timer,因此 np.test(timer=20) 也将报告 20 个最慢的测试。

parametrize 装饰器添加到 numpy.testing#

现在,numpy.testing 中提供了一个基本的 parametrize 装饰器。它旨在允许重写基于 yield 的测试,这些测试已在 pytest 中弃用,以便于将来过渡到 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 的“旧版”打印模式下获得,请参见上面的兼容性说明。

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

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

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 现在可以处理堆叠矩阵了#

之前它仅限于单个 2 维数组。

numpy.save 现在将数据对齐到 64 字节,而不是 16 字节#

使用 numpy.save 将 NumPy 数组保存为 npy 格式时,会在数组数据之前插入填充,使其对齐到 64 字节。以前这只是 16 字节(有时甚至由于版本 2 中的代码错误而更少)。现在对齐是 64 字节,这与最常见的 SIMD 指令集匹配,也是最常见的缓存行大小。这使得 npy 文件在用 mmap 打开的程序中更容易使用,尤其是在 Linux 上,其中 mmap 偏移量必须是页面大小的倍数。

现在可以无需使用临时文件来写入 NPZ 文件了#

在 Python 3.6+ 中,numpy.saveznumpy.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 位)的 strrepr 现在会打印出最短的十进制表示,该表示可以唯一地标识该值,使其与其他相同类型的值区分开来。以前这仅适用于 float64 值。现在,其余的浮点类型通常会比 numpy 1.13 中的短。以科学计数法打印的数组现在也使用最短的科学表示,而不是像以前那样使用固定精度。

此外,与 python2 的 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",它将输出足够的位数来唯一指定数组元素。

inf*jnan*j 这样的值的 Numpy 复数浮点标量现在打印为 infjnanj,就像纯 Python 的 complex 类型一样。

FloatFormatLongFloatFormat 类已被弃用,应替换为 FloatingFormat。同样,ComplexFormatLongComplexFormat 应替换为 ComplexFloatingFormat

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

现在,对于非结构化的 np.void 元素,例如 V4 数据类型,会打印与 Python bytes 类型兼容的十六进制表示形式。以前,在 python2 中,元素的原始 void 数据会打印到 stdout,而在 python3 中,会显示整数字节值。

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

现在可以使用 np.set_printoptionsformatter 参数,并使用 'void' 键(而不是之前的通用的 numpystr 键)来独立自定义 np.void 数组的打印样式。

减少了 np.loadtxt 的内存使用量#

np.loadtxt 现在以块的形式读取文件,而不是一次性读取所有文件,这大大减少了大型文件的内存使用量。

更改#

结构化数组的多字段索引/赋值#

如先前版本中所警告的那样,结构化数组的多字段索引和赋值方式已在多个方面进行了更改。

首先,使用多个字段索引结构化数组(例如,arr[['f1', 'f3']])会返回原始数组的视图,而不是副本。与 1.13 中的副本不同,返回的视图将具有与原始数组中的中间字段对应的额外填充字节,这将影响诸如 arr[['f1', 'f3']].view(newdtype) 之类的代码。

其次,结构化数组之间的赋值现在将按“位置”而不是按“字段名称”进行。目标的第 N 个字段将被设置为源的第 N 个字段,而与字段名称无关,这与 numpy 1.6 到 1.13 版本中的情况不同,在 numpy 1.6 到 1.13 版本中,目标数组中的字段被设置为源数组中相同名称的字段,如果源没有该字段,则设置为 0。

相应地,在计算数据类型相等性时,结构化数据类型中字段的顺序现在很重要。例如,对于数据类型

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({'a': ('i4', 0), 'b': ('f4', 4)}))在 python < 3.6 中很危险,因为在这些版本中不保留字典键的顺序。

将结构化数组赋值给布尔数组现在会引发 ValueError 错误,这与 1.13 版本不同,在 1.13 版本中,它总是将目标元素设置为 True

将具有多个字段的结构化数组赋值给非结构化数组现在会引发 ValueError 错误。在 1.13 版本中,这只会将源数组的第一个字段复制到目标数组。

现在不允许在多字段索引中使用字段 “titles”,也不允许在多字段索引中重复字段名称。

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

整数和 Void 标量现在不受 np.set_string_function 的影响。#

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

0 维数组打印已更改,array2string 的 style 参数已弃用。#

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

现在,0 维数组的 str 的行为类似于使用 str(a[()]) 的 NumPy 标量,而 repr 的行为类似于使用 formatter(a[()]) 的更高维度数组,其中 formatter 可以使用 np.set_printoptions 指定。np.array2stringstyle 参数已弃用。

这种新行为在 1.13 版本的传统打印模式下被禁用,请参阅上面的兼容性说明。

使用数组为 RandomState 设置种子需要一维数组。#

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

MaskedArray 对象显示更有用的 repr#

MaskedArrayrepr 现在更接近于生成它的 Python 代码,数组现在显示逗号和 dtype。与其他的格式化更改一样,可以使用 1.13 版本的传统打印模式禁用此更改,以帮助过渡 doctest。

np.polynomial 类的 repr 更加明确。#

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

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