NumPy 1.3.0 Release Notes#

此次小版本发布包含了大量的错误修复、对 Python 2.6 的官方支持,以及诸如通用 ufuncs 等多项新功能。

亮点#

Python 2.6 支持#

在所有之前支持的平台上,包括 Windows,现在都支持 Python 2.6。

https://pythonlang.cn/dev/peps/pep-0361/

通用 ufuncs#

正如 https://scipy.org.cn/scipy/numpy/wiki/GeneralLoopingFunctions 所解释的,不仅需要对标量函数进行循环,还需要对向量(或数组)函数进行循环。我们建议通过泛化通用函数 (ufuncs) 来实现这一概念,并提供一个 C 实现,该实现为 numpy 代码库增加了约 500 行代码。在当前(专用)ufuncs 中,基本函数仅限于逐元素操作,而通用版本支持“子数组”对“子数组”的操作。Perl 向量库 PDL 提供了类似的功能,其术语将在下文中重用。

每个通用 ufunc 都附带相关信息,说明输入的“核心”维度以及输出的相应维度(逐元素 ufuncs 的核心维度为零)。所有参数的核心维度列表称为 ufunc 的“签名”。例如,ufunc numpy.add 的签名是 “(),()->()”,它定义了两个标量输入和一个标量输出。

另一个例子(参见 GeneralLoopingFunctions 页面)是函数 inner1d(a,b),其签名是 “(i),(i)->()”。这沿着每个输入的最后一个轴执行内积,但保持其余索引不变。例如,如果 a 的形状是 (3,5,N) 且 b 的形状是 (5,N),这将返回一个形状为 (3,5) 的输出。底层的基本函数会被调用 3*5 次。在签名中,我们为每个输入指定一个核心维度 “(i)”,为输出指定零个核心维度 “()”,因为它接受两个一维数组并返回一个标量。通过使用相同的名称 “i”,我们指定两个对应的维度大小相同(或其中一个的大小为 1 并会被广播)。

核心维度之外的维度称为“循环”维度。在上述示例中,这对应于 (3,5)。

标准的 numpy“广播”规则适用,其中签名决定了每个输入/输出对象的维度如何划分为核心维度和循环维度。

当输入数组的维度小于相应核心维度的数量时,会在其形状前面添加 1。从所有输入中移除核心维度,并将剩余的维度进行广播;这将定义循环维度。输出由循环维度加上输出核心维度给出。

实验性的 Windows 64 位支持#

现在可以在 Windows 64 位(仅限 amd64,不支持 IA64)上使用 MS 编译器和 mingw-w64 编译器构建 Numpy。

这是高度实验性的:请勿用于生产环境。有关限制以及如何自行构建的信息,请参阅 INSTALL.txt 中的 Windows 64 位部分。

新功能#

格式化问题#

浮点数格式化现在由 numpy 处理,而不是 C 运行时:这使得支持独立于区域设置的格式化,以及更健壮的 fromstring 和相关方法。特殊值(inf 和 nan)在不同平台上的表现也更加一致(nan 与 IND/NaN 等),并且与最近的 Python 格式化工作(2.6 及更高版本)更加一致。

max/min 中的 NaN 处理#

最大/最小值 ufuncs 现在可以可靠地传播 NaN。如果其中一个参数是 NaN,则返回 NaN。这会影响 np.min/np.max、amin/amax 和数组方法 max/min。为了处理不传播 NaN 的情况,添加了新的 ufuncs fmax 和 fmin。

sign 中的 NaN 处理#

ufunc sign 现在为 NaN 的符号返回 NaN。

新 ufuncs#

  1. fmax - 对于整数类型和非 NaN 浮点数,与 maximum 相同。如果一个参数是 NaN,则返回非 NaN 参数;如果两个参数都是 NaN,则返回 NaN。

  2. fmin - 对于整数类型和非 NaN 浮点数,与 minimum 相同。如果一个参数是 NaN,则返回非 NaN 参数;如果两个参数都是 NaN,则返回 NaN。

  3. deg2rad - 将角度转换为弧度,与 radians ufunc 相同。

  4. rad2deg - 将弧度转换为角度,与 degrees ufunc 相同。

  5. log2 - 以 2 为底的对数。

  6. exp2 - 以 2 为底的指数。

  7. trunc - 将浮点数截断为最接近零的整数。

  8. logaddexp - 将以对数形式存储的数字相加,并返回结果的对数。

  9. logaddexp2 - 将以 2 为底的对数形式存储的数字相加,并返回结果的以 2 为底的对数。

掩码数组#

多项新功能和错误修复,包括

  • 结构化数组现在应完全支持 MaskedArray (r6463, r6324, r6305, r6300, r6294…)

  • 次要错误修复 (r6356, r6352, r6335, r6299, r6298)

  • 改进了对 __iter__ 的支持 (r6326)

  • 使 baseclass、sharedmask 和 hardmask 可供用户访问(但只读)

  • 文档更新

gfortran 在 Windows 上的支持#

现在可以在 Windows 上将 Gfortran 用作 numpy 的 fortran 编译器,即使 C 编译器是 Visual Studio(VS 2005 及以上版本;VS 2003 将不工作)。Gfortran + Visual Studio 在 Windows 64 位上无法工作(但 gcc + gfortran 可以)。目前尚不清楚在 x64 上是否可能同时使用 gfortran 和 visual studio。

Windows 二进制文件的 Arch 选项#

现在可以通过命令行绕过 superpack 安装的自动 arch 检测。

numpy-1.3.0-superpack-win32.exe /arch=nosse

将安装一个即使在运行计算机支持 SSE 指令集的情况下也能在任何 x86 上工作的 numpy。

已弃用的功能#

Histogram#

histogram 的语义已修改,以修复长期存在的关于异常值处理的问题。主要变化涉及

  1. bin 边缘的定义,现在包括最右边的边缘,以及

  2. 对右上角异常值的处理,现在将其忽略,而不是计入最右边的 bin。

仍然可以通过使用 new=False 来访问之前的行为,但这已被弃用,并将在 1.4.0 版本中完全移除。

文档更改#

添加了大量文档。用户指南和参考资料都可以通过 sphinx 构建。

新 C API#

Multiarray API#

以下函数已添加到 multiarray C API 中

  • PyArray_GetEndianness:获取运行时字节序。

Ufunc API#

以下函数已添加到 ufunc API 中

  • PyUFunc_FromFuncAndDataAndSignature:声明更通用的 ufunc(通用 ufunc)。

新宏定义#

通过 numpy/npy_cpu.h 可用于 ARCH 特定代码的新公共 C 宏定义

  • NPY_CPU_X86:x86 架构(32 位)

  • NPY_CPU_AMD64:amd64 架构(x86_64,不支持 Itanium)

  • NPY_CPU_PPC:32 位 ppc

  • NPY_CPU_PPC64:64 位 ppc

  • NPY_CPU_SPARC:32 位 sparc

  • NPY_CPU_SPARC64:64 位 sparc

  • NPY_CPU_S390:S390

  • NPY_CPU_IA64:ia64

  • NPY_CPU_PARISC:PARISC

还添加了用于 CPU 字节序的新宏(有关详细信息,请参阅内部更改)。

  • NPY_BYTE_ORDER:整数

  • NPY_LITTLE_ENDIAN/NPY_BIG_ENDIAN 宏定义

这些宏为没有 glibc endian.h 的平台提供了 glibc endian.h 宏的可移植替代方案。

可移植的 NAN、INFINITY 等#

npy_math.h 现在提供了多个可移植宏来获取 NAN、INFINITY。

  • NPY_NAN:等同于 NAN,这是一个 GNU 扩展。

  • NPY_INFINITY:等同于 C99 INFINITY。

  • NPY_PZERO、NPY_NZERO:分别为正零和负零。

相应的单精度和扩展精度宏也可用。为保持一致性,已移除所有对 NAN 的引用或对 NAN 的临时计算。

内部更改#

numpy.core 数学配置重构#

这应该使移植到新平台更容易,并且更健壮。特别是,配置阶段不需要在目标平台上执行任何代码,这是实现交叉编译的第一步。

https://numpy.com.cn/neps/nep-0003-math_config_clean.html

umath 重构#

对 umath/ufunc 代码进行了大量代码清理 (charris)。

构建警告改进#

Numpy 现在可以以 -W -Wall 编译而没有警告。

https://numpy.com.cn/neps/nep-0002-warnfix.html

分离核心数学库#

核心数学函数(基本 C 类型的 sin、cos 等)已放入一个单独的库中;它充当兼容层,支持大多数 C99 数学函数(目前仅限实数)。该库包含针对各种数学函数的平台特定修复,因此使用这些版本应比直接使用平台函数更健壮。现有函数的 API 与 C99 数学函数 API 完全相同;唯一的区别是 npy 前缀(npy_cos 与 cos)。

该核心库将在 1.4.0 版本中提供给任何扩展。

CPU 架构检测#

npy_cpu.h 定义了 numpy 特定的 CPU 宏,例如 NPY_CPU_X86 等。这些宏在不同操作系统和工具链之间是可移植的,并且在解析头文件时设置,因此即使在交叉编译(numpy 构建时未设置值)或多架构二进制文件(例如 Mac OS X 上的 fat binaries)的情况下也可以安全使用。

npy_endian.h 定义了 numpy 特定的字节序宏,模仿 glibc endian.h。NPY_BYTE_ORDER 等同于 BYTE_ORDER,并且定义了 NPY_LITTLE_ENDIAN 或 NPY_BIG_ENDIAN 中的一个。与 CPU 架构一样,这些宏在编译器解析头文件时设置,因此可以用于交叉编译和多架构二进制文件。