NumPy 1.3.0 发行说明#
此次小版本更新包括众多错误修复、对 Python 2.6 的官方支持,以及广义 ufunc 等多项新功能。
亮点#
Python 2.6 支持#
Python 2.6 现已在所有先前支持的平台(包括 Windows)上得到支持。
广义 ufunc#
如 https://scipy.org.cn/scipy/numpy/wiki/GeneralLoopingFunctions 所述,普遍需要不仅对标量函数进行循环,还需要对向量(或数组)函数进行循环。我们建议通过泛化通用函数(ufunc)来实现这一概念,并提供一个 C 语言实现,这将为 NumPy 代码库增加约 500 行代码。在当前的(专用)ufunc 中,基本函数仅限于逐元素操作,而广义版本支持“子数组对子数组”的操作。Perl 向量库 PDL 提供了类似的功能,其术语在下文中被重新使用。
每个广义 ufunc 都附带信息,说明输入数据的“核心”维度以及输出数据的相应维度(逐元素 ufunc 的核心维度为零)。所有参数的核心维度列表称为 ufunc 的“签名”(signature)。例如,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 “广播”(broadcasting)规则适用,其中签名决定了每个输入/输出对象的维度如何划分为核心维度和循环维度。
当输入数组的维度小于对应的核心维度数量时,会在其形状前加上 1。核心维度从所有输入中移除,剩余维度被广播;这定义了循环维度。输出由循环维度加上输出核心维度给出。
实验性 Windows 64 位支持#
NumPy 现已可以在 Windows 64 位系统(仅限 amd64,不包括 IA64)上使用 MS 编译器和 mingw-w64 编译器构建。
这 *极具实验性质*:请勿用于生产环境。有关限制以及如何自行构建的更多信息,请参阅 INSTALL.txt 的 Windows 64 位部分。
新功能#
格式化问题#
浮点数格式化现在由 NumPy 而非 C 运行时处理:这使得格式化与区域设置无关,并使 `fromstring` 及相关方法更健壮。特殊值(无穷大和 NaN)在不同平台间也更一致(例如 NaN 与 IND/NaN 的区别),并且与最近的 Python 格式化工作(2.6 及更高版本)更一致。
max/min 中的 NaN 处理#
最大值/最小值 ufunc 现在能可靠地传播 NaN。如果其中一个参数是 NaN,则返回 NaN。这影响到 `np.min`/`np.max`、`amin`/`amax` 以及数组方法 `max`/`min`。已添加新的 ufunc `fmax` 和 `fmin` 来处理不传播 NaN 的情况。
sign 中的 NaN 处理#
ufunc `sign` 现在对 NaN 的符号返回 NaN。
新 ufunc#
`fmax` - 对于整数类型和非 NaN 浮点数与 `maximum` 相同。如果其中一个参数是 NaN,则返回非 NaN 参数;如果两个参数都是 NaN,则返回 NaN。
`fmin` - 对于整数类型和非 NaN 浮点数与 `minimum` 相同。如果其中一个参数是 NaN,则返回非 NaN 参数;如果两个参数都是 NaN,则返回 NaN。
`deg2rad` - 将度转换为弧度,与 `radians` ufunc 相同。
`rad2deg` - 将弧度转换为度,与 `degrees` ufunc 相同。
`log2` - 以 2 为底的对数。
`exp2` - 以 2 为底的指数函数。
`trunc` - 将浮点数截断为最接近零的整数。
`logaddexp` - 将以对数形式存储的数字相加,并返回结果的对数。
`logaddexp2` - 将以 2 为底的对数形式存储的数字相加,并返回结果的 2 为底的对数。
掩码数组#
包括多项新功能和错误修复,包括:
结构化数组现在应完全受 `MaskedArray` 支持 (r6463, r6324, r6305, r6300, r6294…)
小错误修复 (r6356, r6352, r6335, r6299, r6298)
改进了对 `__iter__` 的支持 (r6326)
使 `baseclass`、`sharedmask` 和 `hardmask` 对用户可访问(但只读)
文档更新
Windows 上的 gfortran 支持#
现在可以在 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` 安装程序的自动架构检测
numpy-1.3.0-superpack-win32.exe /arch=nosse
将安装一个 NumPy 版本,该版本可在任何 x86 计算机上运行,即使当前计算机支持 SSE 指令集。
已弃用功能#
直方图#
直方图的语义已进行修改,以修复长期存在的异常值处理问题。主要变化涉及:
分箱边缘的定义,现在包括最右侧的边缘,以及
对上限异常值的处理,现在是忽略而不是计入最右侧的分箱。
以前的行为仍可通过使用 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`,可为特定架构代码提供新的公共 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` 宏的平台提供了可移植的替代方案。
可移植的 NAN、INFINITY 等…#
`npy_math.h` 现在提供了多个可移植宏来获取 NAN、INFINITY
`NPY_NAN`:等同于 `NAN`,后者是 GNU 扩展
`NPY_INFINITY`:等同于 C99 的 `INFINITY`
`NPY_PZERO`、`NPY_NZERO`:分别为正零和负零
相应的单精度和扩展精度宏也已可用。为保持一致性,所有对 `NAN` 的引用或自行实时计算 `NAN` 的做法都已移除。
内部变更#
numpy.core 数学配置重构#
这将使移植到新平台变得更容易、更健壮。特别是,配置阶段无需在目标平台上执行任何代码,这是实现交叉编译的第一步。
umath 重构#
对 umath/ufunc 代码进行了大量清理 (charris)。
改进构建警告#
NumPy 现在可以使用 `-W -Wall` 选项构建而无警告
独立核心数学库#
核心数学函数(`sin`、`cos` 等,用于基本 C 类型)已被放入一个独立的库中;它充当一个兼容层,以支持大多数 C99 数学函数(目前仅支持实数)。该库包含了针对各种数学函数的平台特定修复,因此使用这些版本应该比直接使用平台函数更健壮。现有函数的 API 与 C99 数学函数 API 完全相同;唯一的区别是 `npy` 前缀(`npy_cos` vs `cos`)。
该核心库将在 1.4.0 版本中提供给所有扩展。
CPU 架构检测#
`npy_cpu.h` 定义了 NumPy 特定的 CPU 宏定义,例如 `NPY_CPU_X86` 等……这些宏在操作系统和工具链之间是可移植的,并且在头文件被解析时设置,因此即使在交叉编译(NumPy 构建时未设置值)或多架构二进制文件(例如 Max OS X 上的胖二进制文件)的情况下,它们也可以安全使用。
`npy_endian.h` 定义了 NumPy 特定的字节序宏定义,其模式类似于 glibc 的 `endian.h`。`NPY_BYTE_ORDER` 等同于 `BYTE_ORDER`,并且定义了 `NPY_LITTLE_ENDIAN` 或 `NPY_BIG_ENDIAN` 中的一个。至于 CPU 架构,这些宏在编译器解析头文件时设置,因此可用于交叉编译和多架构二进制文件。