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
、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
。不推荐使用
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.lstsq
的rcond
默认值将更改。np.linalg.lstsq
的rcond
参数将其默认值更改为机器精度乘以输入数组维度的最大值。当未显式传递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_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
不连续时,a.flat.__array__()
返回不可写的数组#
其目的是,当 a
不连续时,以前返回的 UPDATEIFCOPY 数组将在将来被可写的副本替换。此临时措施旨在通知希望在这种情况下修改基础数组的人员,这种情况将不再发生。最有可能注意到这种情况的地方是使用 np.asarray(a.flat)
形式的表达式时,或者当 a.flat
作为 ufunc 的 out 参数传递时。
当收缩 0 长度维度时,np.tensordot
现在返回零数组#
之前,当收缩 0 长度维度时,np.tensordot
会引发 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 <测试文件路径>
会导致错误。
现在对非结构化 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
#
当传递的变量不是 datetime
或 timedelta
类型时,ufunc isnat
过去会引发 ValueError
。现在已更改为引发 TypeError
。
当传递错误的类型时,dtype.__getitem__
会引发 TypeError
#
当使用浮点数索引时,dtype 对象过去会引发 ValueError
。
现在,用户定义的类型需要实现 __str__
和 __repr__
#
以前,用户定义的类型可以回退到 numpy 中实现的 __str__
和 __repr__
的默认实现,但这现在已被删除。现在,用户定义的类型将回退到 python 默认的 object.__str__
和 object.__repr__
。
对数组打印进行了许多更改,可以使用新的“传统”打印模式禁用这些更改#
ndarray 和 numpy 标量的 str
和 repr
已以多种方式更改。这些更改可能会破坏下游用户的 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
小数输出,有时会缩短float32
和float128
输出。float64
应该不受影响。请参阅np.set_printoptions
的新floatmode
选项。以科学计数法打印的浮点数组不再使用固定精度,现在显示最短的唯一表示形式。
浮点标量的
str
不再在 python2 中被截断。
对于其他数据类型
非有限复数标量打印为
nanj
而不是nan*j
。datetime 数组中的
NaT
值现在已正确对齐。现在使用十六进制表示法打印
np.void
数据类型的数组和标量。
对于换行
如果数组输出的最后一行没有空间,则 ndarray repr 的“dtype”部分现在将打印在下一行。
现在始终遵守
linewidth
格式选项。除非单个元素太宽,否则数组的 repr 或 str 将永远不会超过此值。数组字符串的最后一行将永远不会有比前面的行更多的元素。
如果元素太宽,则不再在第一行插入额外的空格。
对于摘要(使用
...
来缩短长数组)不再为
str
插入尾随逗号。以前,str(np.arange(1001))
给出的结果是'[ 0 1 2 ..., 998 999 1000]'
,其中有一个额外的逗号。对于 2-D 及以上的数组,当
...
被打印在它自己的行上,以便总结除最后一个轴之外的任何轴时,现在会在该行附加换行符以匹配其前导换行符并删除尾随空格字符。
现在,
MaskedArray
数组在打印元素时使用逗号分隔,始终打印 dtype,并能正确地将长数组的元素换行显示。如果数组的维度超过 1,现在将使用新的“左对齐”打印样式来打印数组属性。recarray
数组不再在其 dtype 前打印尾随空格,并会换行到正确的列数。0 维数组不再有其自己特有的
str
和repr
实现。np.array2string
的style
参数已被弃用。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_ARRAY2
,NPY_ARRAY_INOUT_FARRAY
应替换为 NPY_ARRAY_INOUT_FARRAY2
。使用这些新标志创建的数组将具有 WRITEBACKIFCOPY
语义。
如果 PyPy 兼容性不是问题,则可以忽略这些新函数,尽管会有一个 DeprecationWarning
。如果您希望追求 PyPy 兼容性,可以在 c-api 文档和 how-to-extend 中的示例中找到有关这些函数及其用法的更多信息。
新特性#
文本 IO 函数的 encoding 参数#
genfromtxt
、loadtxt
、fromregex
和 savetxt
现在可以通过 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 函数现在可以透明地读取带有 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 许可下发布的 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.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 float 相同的
str
和repr
。
提供了新函数 np.format_float_scientific
和 np.format_float_positional
来生成这些十进制表示。
在 np.set_printoptions
和 np.array2string
中添加了一个新选项 floatmode
,它可以控制数组中打印元素的唯一性和舍入。新的默认值是 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 中,元素的原始 void 数据会打印到 stdout,而在 python3 中,会显示整数字节值。
现在可以独立自定义 void
数据类型的打印样式#
现在可以使用 np.set_printoptions
的 formatter
参数,并使用 '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 标量的 str
和 repr
可以通过 np.set_string_function
来控制。现在不再可能。
0 维数组打印已更改,array2string 的 style
参数已弃用。#
以前,0 维数组的 str
和 repr
具有特殊的实现,对于 0 维数组 a
,分别返回 str(a.item())
和 'array(' + repr(a.item()) + ')'
,这与 NumPy 标量和更高维度的 ndarray 不同。
现在,0 维数组的 str
的行为类似于使用 str(a[()])
的 NumPy 标量,而 repr
的行为类似于使用 formatter(a[()])
的更高维度数组,其中 formatter
可以使用 np.set_printoptions
指定。np.array2string
的 style
参数已弃用。
这种新行为在 1.13 版本的传统打印模式下被禁用,请参阅上面的兼容性说明。
使用数组为 RandomState
设置种子需要一维数组。#
RandomState
之前会接受空数组或具有 2 个或更多维度的数组,这会导致设置种子失败(空数组),或者在设置种子时忽略传递的某些值。
MaskedArray
对象显示更有用的 repr
。#
MaskedArray
的 repr
现在更接近于生成它的 Python 代码,数组现在显示逗号和 dtype。与其他的格式化更改一样,可以使用 1.13 版本的传统打印模式禁用此更改,以帮助过渡 doctest。
np.polynomial
类的 repr
更加明确。#
现在它将域和窗口参数显示为关键字参数,使其更清晰。
>>> np.polynomial.Polynomial(range(4))
Polynomial([0., 1., 2., 3.], domain=[-1, 1], window=[-1, 1])