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 用于沿现有轴连接数组的功能。

  • 向 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 属性不再支持用于数组打印。

  • 关键字 skiprowsmissing 已从 np.genfromtxt 中移除。

  • 关键字 old_behavior 已从 np.correlate 中移除。

未来的更改#

  • 在像 arr1 == arr2 这样的数组比较中,许多涉及字符串或结构化 dtype 的极端情况以前返回标量,现在会发出 FutureWarningDeprecationWarning,将来将更改为执行逐元素比较或引发错误。

  • np.lib.split 中,结果中的空数组始终具有 (0,) 维度,无论被分割数组的维度如何。在 NumPy 1.11 中,此行为将更改,以便保留维度。自 NumPy 1.9 以来,此更改的 FutureWarning 一直存在,但由于错误,有时不会发出警告,并且维度已被保留。

  • 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') 来以向后兼容的方式进行更新。自 NumPy 1.7 以来,旧的 'unsafe' 默认值已被弃用。

numpy 版本字符串#

开发版本的 numpy 版本字符串已从 x.y.z.dev-githash 更改为 x.y.z.dev0+githash(注意 +),以符合 PEP 440。

宽松的步幅检查#

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.ravelnp.diagonalnp.diag 现在保留子类型#

x.ravel()np.ravel(x) 之间,以及 x.diagonal()np.diagonal(x) 之间存在不一致的行为,其中方法保留子类型,而函数则没有。此问题已修复,函数现在像方法一样工作,保留子类型,但矩阵除外。出于向后兼容性,矩阵是特殊情况,仍然像以前一样返回一维数组。如果您需要保留矩阵子类型,请使用方法而不是函数。

rollaxisswapaxes 始终返回视图#

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

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。值得注意的是,这会影响包含带有空格的字符串的 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。

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

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

当遇到无效值时,Median 会发出警告并返回 nan#

与 mean 类似,median 和 percentile 现在会在存在 NaN 的切片中发出运行时警告并返回 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 复数函数#

现在检测到 in 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 正确处理整数类型的最小值#

为了正确处理整数类型的最小值,np.isclose 现在会在比较期间转换为浮点类型。这使其行为与 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 函数具有用于控制 pickle 化 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.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 版本以来,如果大小与现有类型不对应,则根据其字符串表示创建 dtype 对象(例如'f4')将发出弃用警告,并默认为创建该类型默认大小的 dtype。从本版本开始,这将引发TypeError

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

为了准备即将发生的此更改,对象 dtype 的字符串表示(即np.dtype(object).str)不再包含项目大小,即返回'|O'而不是之前的'|O4''|O8'