NumPy 1.10.0 发行说明#
此版本支持 Python 2.6 - 2.7 和 3.2 - 3.5。
亮点#
numpy.distutils 现在支持通过传递给 setup.py build 的 –parallel/-j 参数进行并行编译
numpy.distutils 现在支持通过 site.cfg 进行额外的自定义,以控制编译参数,例如运行时库、额外的链接/编译标志。
新增 np.linalg.multi_dot:在一个函数调用中计算两个或多个数组的点积,同时自动选择最快的求值顺序。
新函数 np.stack 提供了一个通用接口,用于沿新轴连接一系列数组,补充了 np.concatenate 沿现有轴连接的功能。
将 nanprod 添加到 nanfunctions 函数集。
支持 Python 3.5 中的 '@' 运算符。
已终止支持#
_dotblas 模块已被移除。CBLAS 支持现在已集成到 Multiarray 中。
testcalcs.py 文件已被移除。
polytemplate.py 文件已被移除。
npy_PyFile_Dup 和 npy_PyFile_DupClose 已从 npy_3kcompat.h 中移除。
splitcmdline 已从 numpy/distutils/exec_command.py 中移除。
try_run 和 get_output 已从 numpy/distutils/command/config.py 中移除。
不再支持数组打印中的 a._format 属性。
skiprows
和missing
关键字已从 np.genfromtxt 中移除。old_behavior
关键字已从 np.correlate 中移除。
未来变更#
在诸如
arr1 == arr2
的数组比较中,许多涉及字符串或结构化 dtype 的特殊情况过去返回标量,现在会发出FutureWarning
或DeprecationWarning
,未来将改为执行元素级比较或引发错误。在
np.lib.split
中,结果中的空数组无论被分割数组的维度如何,其维度始终为(0,)
。在 NumPy 1.11 中,该行为将改变以保留维度。此更改的FutureWarning
自 NumPy 1.9 以来就已存在,但由于一个错误,有时没有发出警告且维度已被保留。SafeEval 类将在 NumPy 1.11 中移除。
alterdot 和 restoredot 函数将在 NumPy 1.11 中移除。
有关这些更改的更多详细信息,请参见下文。
兼容性说明#
默认类型转换规则变更#
原地操作的默认类型转换已更改为 'same_kind'
。例如,如果 n 是一个整数数组,f 是一个浮点数数组,那么 n += f
将导致 TypeError
,而在之前的 NumPy 版本中,浮点数会被静默转换为整数。在极不可能出现示例代码不是实际错误的情况下,可以通过将其重写为 np.add(n, f, out=n, casting='unsafe')
的方式向后兼容地更新它。旧的 'unsafe'
默认值自 NumPy 1.7 起已被弃用。
numpy 版本字符串#
为符合 PEP 440,开发版本构建的 numpy 版本字符串已从 x.y.z.dev-githash
更改为 x.y.z.dev0+githash
(注意加号)。
放松步幅检查#
NPY_RELAXED_STRIDE_CHECKING 现在默认为 True。
更新:在 1.10.2 版本中,出于向后兼容性原因,NPY_RELAXED_STRIDE_CHECKING 的默认值已更改为 false。在将其设为默认值之前,需要更多时间。作为路线图的一部分,还添加了对非 C-contiguous 数组的 f_contiguous 维度更改视图的弃用。
除了 axis=0
之外,沿任何轴连接一维数组都会引发 IndexError
#
自 NumPy 1.7 以来,使用 axis != 0 就会引发 DeprecationWarning,现在会引发错误。
np.ravel、np.diagonal 和 np.diag 现在保留子类型#
x.ravel() 和 np.ravel(x) 之间,以及 x.diagonal() 和 np.diagonal(x) 之间存在不一致的行为:方法保留子类型,而函数不保留。这已得到修复,现在函数行为与方法一致,保留子类型,但矩阵除外。矩阵是为了向后兼容而特殊处理的,仍然像以前一样返回一维数组。如果需要保留矩阵子类型,请使用方法而不是函数。
rollaxis 和 swapaxes 总是返回一个视图#
以前,除了轴序没有改变的情况(此时返回输入数组)之外,都会返回一个视图。现在在所有情况下都返回一个视图。
nonzero 现在返回基本 ndarray#
以前,一维输入(返回基本 ndarray)和高维输入(保留子类)之间存在不一致。现在行为已统一,返回将是基本 ndarray。子类仍然可以通过提供自己的 nonzero 方法来覆盖此行为。
C API#
swapaxes 的更改也适用于 PyArray_SwapAxes C 函数,该函数现在在所有情况下都返回一个视图。
nonzero 的更改也适用于 PyArray_Nonzero C 函数,该函数现在在所有情况下都返回一个基本 ndarray。
dtype 结构 (PyArray_Descr) 在末尾新增了一个成员,用于缓存其哈希值。这应该不会影响任何编写良好的应用程序。
串联函数 DeprecationWarning 的更改也影响 PyArray_ConcatenateArrays,
recarray 字段返回类型#
以前,通过属性和索引访问的 recarray 字段的返回类型不一致,字符串类型的字段会作为 chararrays 返回。现在,通过属性或索引访问的字段,非结构化类型的字段将返回 ndarray,而结构化类型的字段将返回 recarray。值得注意的是,这会影响包含带空格字符串的 recarrays,因为 chararrays 会截断尾随空格,而字符串类型的 ndarrays 会保留尾随空格。此外,嵌套结构化字段的 dtype.type 现在已继承。
recarray 视图#
现在,将 ndarray 视为 recarray 会自动将 dtype 转换为 np.record。请参阅新的记录数组文档。此外,将具有非结构化 dtype 的 recarray 视为 recarray 不再将结果类型转换为 ndarray - 结果仍将是 recarray。
ufunc 的 'out' 关键字参数现在接受数组元组#
使用 ufunc 的 'out' 关键字参数时,可以提供一个数组元组,每个 ufunc 输出一个数组。对于具有单个输出的 ufunc,单个数组也是有效的 'out' 关键字参数。以前,在 'out' 关键字参数中可以提供单个数组,并将其用作具有多个输出的 ufunc 的第一个输出,此做法已被弃用,现在将导致 DeprecationWarning,未来将导致错误。
字节数组索引现在会引发 IndexError#
在 Python 3 中使用字节字符串对 ndarray 进行索引现在会引发 IndexError 而不是 ValueError。
包含带数组对象的掩码数组#
对于此类(罕见)掩码数组,获取单个被掩码的项不再返回损坏的掩码数组,而是返回该项的完全掩码版本。
遇到无效值时,中位数会发出警告并返回 nan#
类似于均值,中位数和百分位数现在会在存在 NaN 的切片中发出运行时警告并返回 NaN。要在忽略无效值的情况下计算中位数或百分位数,请使用新的 nanmedian 或 nanpercentile 函数。
numpy.ma.testutils 中可用的函数已更改#
numpy.testing 中的所有函数都曾可通过 numpy.ma.testutils 获得,但并非所有函数都被重新定义以与掩码数组一起使用。现在,这些函数中的大部分已从 numpy.ma.testutils 中移除,只保留了少量子集以保持向后兼容性。从长远来看,这应该有助于避免错误使用不正确的函数,但可能会给某些用户带来导入问题。
新特性#
从 site.cfg 读取额外标志#
以前,依赖库和 NumPy 本身的编译自定义只能通过修改 distutils 包中的代码来实现。现在 numpy.distutils 会从 *site.cfg* 的每个组中读取以下额外标志:
runtime_library_dirs/rpath
,设置运行时库目录以覆盖LD_LIBRARY_PATH
extra_compile_args
,为源代码编译添加额外标志extra_link_args
,链接库时添加额外标志
这至少应该部分地完成用户自定义。
np.cbrt 计算实浮点数的立方根#
np.cbrt 封装了 C99 立方根函数 cbrt。与 np.power(x, 1./3.) 相比,它对负实浮点数有良好的定义,并且速度更快一些。
numpy.distutils 现在允许并行编译#
通过向 setup.py build 传递 –parallel=n 或 -j n,现在扩展的编译将在 n 个并行进程中执行。并行化仅限于一个扩展内的文件,因此使用 Cython 的项目不会从中受益,因为它从单个文件构建扩展。
genfromtxt 新增 max_rows
参数#
genfromtxt 中已添加 max_rows
参数,用于限制单次调用中读取的行数。利用此功能,可以通过重复调用该函数来读取存储在单个文件中的多个数组。
新函数 np.broadcast_to 用于调用数组广播#
np.broadcast_to 根据 NumPy 的广播规则手动将数组广播到给定形状。该功能类似于 broadcast_arrays(实际上已重写为内部使用 broadcast_to),但只需单个数组。
用于测试警告的新上下文管理器 clear_and_catch_warnings#
当 Python 发出警告时,它会在引发警告的模块中记录该警告已发出,并存储在模块属性 __warningregistry__
中。一旦发生这种情况,除非清除 __warningregistry__
中的相关条目,否则无法再次发出该警告。这使得测试警告变得困难和脆弱,因为如果您的测试是在另一个已经引发警告的测试之后进行的,您将无法发出或测试该警告。上下文管理器 clear_and_catch_warnings
在进入时清除模块注册表中的警告,并在退出时重置它们,这意味着警告可以被重新引发。
cov 新增 fweights
和 aweights
参数#
fweights
和 aweights
参数通过对观测向量应用两种类型的加权,为协方差计算添加了新功能。fweights
数组表示每个观测向量的重复次数,而 aweights
数组则提供了它们的相对重要性或概率。
支持 Python 3.5+ 中的 '@' 运算符#
Python 3.5 增加了对 PEP465 中提出的矩阵乘法运算符 '@' 的支持。已实现了对其的初步支持,并添加了一个等效函数 matmul
,用于测试和在早期 Python 版本中使用。该函数是初步的,其可选参数的顺序和数量预计会发生变化。
fft 函数新增 norm
参数#
默认归一化使正向变换不缩放,逆向变换按 \(1/n\) 缩放。通过将关键字参数 norm
设置为 "ortho"
(默认值为 None),可以获得酉变换,这样正向和逆向变换都将按 \(1/\\sqrt{n}\) 缩放。
改进#
np.digitize 使用二分查找#
np.digitize 现在是根据 np.searchsorted 实现的。这意味着使用二分查找来分箱值,这对于大量分箱而言比以前的线性查找具有更好的可扩展性。它还消除了输入数组必须为一维的要求。
np.poly 现在将整数输入转换为浮点数#
np.poly 现在会将整数类型的一维输入数组转换为双精度浮点数,以防止在计算首一多项式时发生整数溢出。仍然可以通过传入对象类型数组(例如用 Python 整数填充)来获得更高精度的结果。
np.interp 现在可用于周期函数#
np.interp 现在有一个新参数 period,它提供输入数据 xp 的周期。在这种情况下,输入数据将根据给定周期正确归一化,并在 xp 的每个端点添加一个端点,以闭合前一个和下一个周期循环,从而产生正确的插值行为。
np.pad 支持 pad_width
和 constant_values
的更多输入类型#
constant_values
参数现在接受 NumPy 数组和浮点值。NumPy 数组支持作为 pad_width
的输入,如果其值不是整数类型,则会引发异常。
np.argmax 和 np.argmin 现在支持 out
参数#
为了与 ndarray.argmax 和 ndarray.argmin 保持一致,out
参数已添加到 np.argmax 和 np.argmin 中。新参数的行为与这些方法中的行为完全相同。
检测并使用更多系统 C99 复数函数#
complex.h
中的所有函数现在都可被检测到。以下函数有新的备用实现:
npy_ctan,
npy_cacos, npy_casin, npy_catan
npy_ccosh, npy_csinh, npy_ctanh,
npy_cacosh, npy_casinh, npy_catanh
由于这些改进,返回的值会有一些小的变化,特别是对于特殊情况。
np.loadtxt 支持 float.hex
方法生成的字符串#
float.hex
产生的字符串类似于 0x1.921fb54442d18p+1
,因此这并不是用于表示无符号整数类型的十六进制。
np.isclose 正确处理整数 dtype 的最小值#
为了正确处理整数类型的最小值,np.isclose 现在在比较期间将转换为浮点 dtype。这使其行为与 np.allclose 提供的行为保持一致。
np.allclose 内部使用 np.isclose。#
np.allclose 现在内部使用 np.isclose,并通过设置 equal_nan=True
继承了将 NaN 视为相等的比较能力。现在也保留了子类,例如 np.ma.MaskedArray。
np.genfromtxt 现在正确处理大整数#
np.genfromtxt 现在可以正确处理 32 位系统上大于 2**31-1
和 64 位系统上大于 2**63-1
的整数(以前在这些情况下会因 OverflowError
而崩溃)。大于 2**63-1
的整数将转换为浮点值。
np.load、np.save 具有 pickle 向后兼容性标志#
函数 np.load 和 np.save 具有额外的关键字参数,用于控制 pickled Python 对象的向后兼容性。这使得 Python 3 上的 NumPy 能够加载包含在 Python 2 上生成的对象数组的 npy 文件。
MaskedArray 支持更复杂的基类#
内置的关于基类行为类似于普通数组的假设正在被移除。特别是,设置和获取元素及范围将尊重基类对 __setitem__
和 __getitem__
的覆盖,算术运算将尊重对 __add__
、__sub__
等的覆盖。
变更#
dotblas 功能已移至 multiarray#
dot、inner 和 vdot 的 cblas 版本已集成到 multiarray 模块中。特别是,vdot 现在是一个 multiarray 函数,而以前不是。
更严格地检查 gufunc 签名合规性#
现在对广义通用函数的输入与函数签名进行更严格的检查:所有核心维度都必须存在于输入数组中;具有相同标签的核心维度必须具有完全相同的大小;并且必须指定输出核心维度,可以通过相同标签的输入核心维度或通过传入的输出数组来指定。
np.einsum 返回的视图是可写的#
现在,只要输入数组是可写的,np.einsum 返回的视图就将是可写的。
np.argmin 跳过 NaT 值#
np.argmin 现在会跳过 datetime64 和 timedelta64 数组中的 NaT 值,使其与 np.min、np.argmax 和 np.max 保持一致。
弃用#
涉及字符串或结构化 dtype 的数组比较#
通常,数组上的比较操作会执行元素级比较并返回布尔数组。但在某些特殊情况下,特别是涉及字符串或结构化 dtype 时,NumPy 历来会返回一个标量。例如
### Current behaviour
np.arange(2) == "foo"
# -> False
np.arange(2) < "foo"
# -> True on Python 2, error on Python 3
np.ones(2, dtype="i4,i4") == np.ones(2, dtype="i4,i4,i4")
# -> False
延续 1.9 版本开始的工作,在 1.10 版本中,这些比较现在将引发 FutureWarning
或 DeprecationWarning
,未来它们将被修改,使其行为与其他比较操作更一致,例如
### Future behaviour
np.arange(2) == "foo"
# -> array([False, False])
np.arange(2) < "foo"
# -> error, strings and numbers are not orderable
np.ones(2, dtype="i4,i4") == np.ones(2, dtype="i4,i4,i4")
# -> [False, False]
SafeEval#
numpy/lib/utils.py 中的 SafeEval 类已弃用,将在下一版本中移除。
alterdot, restoredot#
alterdot 和 restoredot 函数不再执行任何操作,并且已被弃用。
pkgload, PackageLoader#
这些加载包的方式现已弃用。
corrcoef 的 bias, ddof 参数#
传递给 corrcoef
函数的 bias
和 ddof
参数的值在相关系数所隐含的除法中抵消,因此对返回值没有影响。
我们现在弃用 corrcoef
和掩码数组版本 ma.corrcoef
的这些参数。
由于我们正在弃用 ma.corrcoef
的 bias
参数,我们也弃用将 allow_masked
参数作为位置参数的使用,因为其位置将随着 bias
的移除而改变。allow_masked
最终将成为一个仅限关键字的参数。
dtype 字符串表示更改#
自 1.6 版本以来,如果从字符串表示(例如 'f4'
)创建 dtype 对象时,如果大小与现有类型不对应,则会发出弃用警告,并默认为该类型创建默认大小的 dtype。从本版本开始,这将引发 TypeError
。
唯一的例外是对象 dtype,其中 'O4'
和 'O8'
仍将发出弃用警告。这种平台相关的表示将在下一版本中引发错误。
为了准备这次即将到来的更改,对象 dtype 的字符串表示(即 np.dtype(object).str
)不再包含项大小,即将返回 '|O'
而不是以前的 '|O4'
或 '|O8'
。