NumPy 1.10.0 Release Notes#

此版本支持 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 的补充。

  • 在 nanfunctions 集合中添加了 nanprod

  • 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 属性。

  • np.genfromtxt 中移除了关键字 skiprowsmissing

  • np.correlate 中移除了关键字 old_behavior

未来变化#

  • 在数组比较中,例如 arr1 == arr2,许多过去会返回标量的涉及字符串或结构化 dtype 的边界情况,现在会发出 FutureWarningDeprecationWarning,并且未来将更改为执行逐元素比较或引发错误。

  • np.lib.split 中,结果中的空数组始终具有 (0,) 的维度,而不管被拆分的数组的维度如何。在 NumPy 1.11 中,此行为将更改为保留维度。此更改的 FutureWarning 自 NumPy 1.9 起已存在,但由于一个 bug,有时不会发出警告,并且维度已经被保留。

  • SafeEval 类将在 NumPy 1.11 中移除。

  • alterdot 和 restoredot 函数将在 NumPy 1.11 中移除。

有关这些更改的更多详细信息,请参见下文。

兼容性说明#

默认强制转换规则更改#

原地操作的默认强制转换为 'same_kind'。例如,如果 n 是一个整数数组,f 是一个浮点数数组,那么 n += f 将导致 TypeError,而在之前的 NumPy 版本中,浮点数会被静默强制转换为整数。如果代码示例不是实际的 bug,那么可以通过将其重写为 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。在使其成为默认值之前需要更多时间。作为路线图的一部分,还添加了对 f_contiguous 但非 c_contiguous 数组的维度更改视图的弃用。

沿 axis=0 以外的任何轴连接一维数组会引发 IndexError#

自 NumPy 1.7 起,使用 axis != 0 已引发 DeprecationWarning,现在它会引发错误。

np.ravelnp.diagonalnp.diag 现在保留子类型#

x.ravel() 和 np.ravel(x) 之间,以及 x.diagonal() 和 np.diagonal(x) 之间存在不一致的行为,其中方法保留子类型而函数不保留。这已得到修复,函数现在表现得像方法一样,保留子类型(除了矩阵的情况)。矩阵是特殊处理的,为了向后兼容,它们仍然像以前一样返回一维数组。如果您需要保留矩阵子类型,请使用方法而不是函数。

rollaxisswapaxes 始终返回视图#

以前,除了在轴的顺序没有改变的情况下返回输入数组外,都会返回视图。现在所有情况下都返回视图。

nonzero 现在返回基ndarray#

以前,一维输入(返回基 ndarray)和更高维输入(保留子类)之间存在不一致。行为已统一,现在返回的是基 ndarray。子类仍然可以通过提供自己的 nonzero 方法来覆盖此行为。

C API#

swapaxes 的更改也适用于 C 函数 PyArray_SwapAxes,该函数现在始终返回一个视图。

nonzero 的更改也适用于 C 函数 PyArray_Nonzero,该函数现在始终返回一个基 ndarray。

dtype 结构(PyArray_Descr)末尾新增了一个成员来缓存其哈希值。这不应影响编写良好的应用程序。

对连接函数 DeprecationWarning 的更改也影响 PyArray_ConcatenateArrays,

recarray 字段返回类型#

以前,通过属性和索引访问的 recarray 字段的返回类型不一致,并且字符串类型的字段作为 chararrays 返回。现在,通过属性或索引访问的字段将为非结构化类型的字段返回 ndarray,为结构化类型的字段返回 recarray。值得注意的是,这会影响包含字符串(带有空格)的 recarray,因为 chararrays 会截断尾随空格,而在字符串类型的 ndarray 中会保留这些空格。此外,嵌套结构化字段的 dtype.type 现在会被继承。

recarray 视图#

将 ndarray 视图视为 recarray 现在会自动将 dtype 转换为 np.record。请参阅新的记录数组文档。此外,使用非结构化 dtype 视图 recarray 不再将结果的类型转换为 ndarray - 结果将保持为 recarray。

ufunc 的‘out’关键字参数现在接受数组元组#

使用 ufunc 的‘out’关键字参数时,可以提供一个数组元组,每个 ufunc 输出一个。对于具有单个输出的 ufunc,单个数组也可以是有效的‘out’关键字参数。以前,可以在‘out’关键字参数中提供单个数组,它将被用作具有多个输出的 ufunc 的第一个输出,这已被弃用,现在将导致 DeprecationWarning,将来将导致错误。

字节数组索引现在引发 IndexError#

在 Python 3 中,使用字节字符串索引 ndarray 现在会引发 IndexError,而不是 ValueError

包含带数组对象的掩码数组#

对于这种(罕见的)掩码数组,获取单个掩码项不再返回损坏的掩码数组,而是返回该项的完全掩码版本。

中位数在遇到无效值时发出警告并返回 nan#

与 mean 类似,median 和 percentile 现在会在包含 NaN 的切片中发出 Runtime 警告并返回 NaN。要计算中位数或百分位数并忽略无效值,请使用新的 nanmediannanpercentile 函数。

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 有新的 fweightsaweights 参数#

fweightsaweights 参数通过对观测向量应用两种类型的加权,为协方差计算增加了新功能。一个 fweights 数组表示每个观测向量的重复次数,一个 aweights 数组提供了它们的相对重要性或概率。

Python 3.5+ 对‘@’运算符的支持#

Python 3.5 增加了对 PEP465 中提出的矩阵乘法运算符‘@’的支持。已实现对此的初步支持,并添加了一个等效函数 matmul 以用于测试目的和在早期 Python 版本中使用。该函数是初步的,其可选参数的顺序和数量可能会发生变化。

fft 函数新增 norm 参数#

默认归一化是直接变换不缩放,逆变换缩放 \(1/n\)。可以通过将关键字参数 norm 设置为 "ortho"(默认为 None)来实现单位变换,这样直接和逆变换都会缩放 \(1/\\sqrt{n}\)

改进#

np.poly 现在将整数输入强制转换为浮点数#

np.poly 现在会将一维整数类型输入数组强制转换为双精度浮点数,以防止在计算单项多项式时发生整数溢出。通过传入一个对象类型的数组(例如,填充 Python 整数),仍然可以获得更高精度的结果。

np.interp 现在可用于周期函数#

np.interp 现在有一个新的参数 period,它提供了输入数据 xp 的周期。在这种情况下,输入数据会被正确地归一化到给定周期,并且会在 xp 的每个极端点添加一个端点,以闭合之前和下一个周期循环,从而产生正确的插值行为。

np.pad 支持 pad_widthconstant_values 的更多输入类型#

constant_values 参数现在接受 NumPy 数组和浮点值。NumPy 数组支持作为 pad_width 的输入,如果其值不是整数类型,则会引发异常。

np.argmaxnp.argmin 现在支持 out 参数#

为了与 ndarray.argmaxndarray.argmin 一致,在 np.argmaxnp.argmin 中添加了 out 参数。新参数的行为与这些方法中的参数完全相同。

检测并使用了更多的系统 C99 复数函数#

现在可以检测 complex.h 中的所有函数。以下函数有新的备用实现:

  • npy_ctan,

  • npy_cacos, npy_casin, npy_catan

  • npy_ccosh, npy_csinh, npy_ctanh,

  • npy_cacosh, npy_casinh, npy_catanh

由于这些改进,返回的值将有一些微小的变化,尤其是在边界情况下。

np.loadtxtfloat.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.loadnp.save 具有 pickle 向后兼容性标志#

函数 np.loadnp.save 具有额外的关键字参数,用于控制 pickled Python 对象的向后兼容性。这使得 NumPy 在 Python 3 上能够加载在 Python 2 上生成但包含对象数组的 npy 文件。

MaskedArray 支持更复杂的基类#

关于基类表现得像普通数组的内置假设正在被移除。特别是,设置和获取元素和范围将尊重基类对 __setitem____getitem__ 的覆盖,算术运算将尊重对 __add____sub__ 等的覆盖。

更改#

dotblas 功能已移至 multiarray#

dot、inner 和 vdot 的 cblas 版本已集成到 multiarray 模块中。特别是,vdot 现在是 multiarray 函数,而以前不是。

对 gufunc 签名合规性的更严格检查#

现在对广义通用函数(gufunc)的输入将根据函数签名进行更严格的检查:输入数组现在必须包含所有核心维度;具有相同标签的核心维度必须具有完全相同的大小;输出核心维度必须指定,可以通过具有相同标签的输入核心维度或通过传递的输出数组来指定。

np.einsum 返回的视图是可写的#

当输入数组是可写的时,从 np.einsum 返回的视图现在将是可写的。

np.argmin 跳过 NaT 值#

np.argmin 现在会跳过 datetime64 和 timedelta64 数组中的 NaT 值,这使其与 np.minnp.argmaxnp.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 中,这些比较现在将引发 FutureWarningDeprecationWarning,并且将来它们将被修改为比其他比较操作更一致的行为,例如:

### 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 函数的 biasddof 参数的值在与相关系数的除法中相互抵消,因此对返回值没有影响。

我们现在弃用 corrcoef 函数及其掩码数组版本 ma.corrcoef 的这些参数。

由于我们弃用了 ma.corrcoefbias 参数,我们也弃用了 allow_masked 参数作为位置参数的使用,因为它的位置将随着 bias 的移除而改变。allow_masked 最终将成为一个仅限关键字的参数。

dtype 字符串表示形式更改#

自 1.6 起,从其字符串表示形式(例如 'f4')创建 dtype 对象,如果大小与现有类型不匹配,将发出弃用警告,并默认为创建该类型默认大小的 dtype。从本版本开始,这将引发 TypeError

唯一例外是对象 dtype,其中 'O4''O8' 仍将发出弃用警告。这种依赖于平台的表示将在下一个版本中引发错误。

为了准备这次即将到来的更改,对象 dtype 的字符串表示形式,即 np.dtype(object).str,不再包含项大小,即返回 '|O' 而不是以前的 '|O4''|O8'