NumPy 1.14.0 发行说明#

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

影响未来发展的一个重要决定是,计划在 2020 年前停止支持 Python 2.7.已决定支持 2018 年发布的所有版本的 2.7,最后一个版本将被指定为长期版本,支持 bug 修复,并持续到 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 .

  • 调用 np.bincount 并使用 minlength=None 已被弃用.应该使用 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 的 dtype 猜测相匹配 - 因此,当传递 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__ .

对数组打印的许多更改,可以使用新的 “legacy” 打印模式禁用#

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

可以通过启用新的 1.13 “legacy” 打印模式来禁用这些新行为,从而在很大程度上重现 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 而不是 nanj .

    • 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 之前打印尾随空格,并换行到正确数量的列.

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

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

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

下面更详细地描述了其中一些更改. 如果您需要为文档测试或其他原因保留先前的行为,您可能需要执行以下操作:

# 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_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 插件. 这允许使用例如 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 装饰器. 它旨在允许重写基于 yield 的测试,这些测试已经在 pytest 中被弃用,以便于将来过渡到 pytest. nose 测试框架已经多年没有得到支持,看起来像是放弃软件.

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

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

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

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

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

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

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

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

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

以前它仅限于单个 2d 数组.

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 不同,浮点标量的 str 将不再在 python2 中被截断. np.double 标量现在具有与 python3 浮点数相同的 strrepr .

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

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

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

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 版本不同,在那些版本中,目标数组中的字段被设置为源数组中相同名称的字段,如果源数组没有该字段,则设置为 0.

相应地,在计算 dtype 相等性时,结构化 dtype 中字段的顺序现在很重要.例如,对于以下 dtype

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 中,这只会将源的第一个字段复制到目标.

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

用户指南中有关结构化数组的文档已得到显著更新,以反映这些变化.

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

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

0d 数组打印已更改, array2stringstyle 参数已弃用#

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

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

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

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

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

MaskedArray 对象显示更有用的 repr#

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

np.polynomial 类的 repr 更加明确#

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

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