NumPy 1.3.0 版本说明#
此小版本包含许多错误修复、正式支持 Python 2.6 以及一些新功能,例如泛化 ufunc。
亮点#
Python 2.6 支持#
现在所有以前支持的平台(包括 Windows)都支持 Python 2.6。
泛化 ufunc#
正如 https://scipy.org.cn/scipy/numpy/wiki/GeneralLoopingFunctions 中所解释的,普遍需要不仅循环遍历标量上的函数,还需要循环遍历向量(或数组)上的函数。我们建议通过泛化通用函数 (ufunc) 来实现这一概念,并提供一个 C 实现,该实现向 NumPy 代码库添加了约 500 行代码。在当前(专用)ufunc 中,基本函数仅限于逐元素操作,而泛化版本支持“子数组”与“子数组”的操作。Perl 向量库 PDL 提供了类似的功能,其术语在以下内容中被重复使用。
每个泛化 ufunc 都与之关联的信息,说明输入的“核心”维度是什么,以及输出的相应维度(逐元素 ufunc 具有零核心维度)。所有参数的核心维度的列表称为 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 位支持#
NumPy 现在可以在 Windows 64 位系统上构建(仅限 amd64,不包括 IA64),可以使用 MS 编译器和 mingw-w64 编译器。
这纯属实验性:请勿用于生产环境。有关限制以及如何自行构建的更多信息,请参见 INSTALL.txt 中的 Windows 64 位部分。
新功能#
格式问题#
浮点数格式现在由 NumPy 处理,而不是由 C 运行时处理:这使得格式与区域设置无关,并且使 fromstring 和相关方法更加健壮。特殊值(inf 和 nan)在不同平台上的也更加一致(nan vs 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 浮点数的最大值相同。如果一个参数是 NaN,则返回非 NaN 参数;如果两个参数都是 NaN,则返回 NaN。
fmin - 与整数类型和非 NaN 浮点数的最小值相同。如果一个参数是 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)
使基类、共享掩码和硬掩码对用户可见(但只读)
文档更新
Windows 上的 Gfortran 支持#
现在可以使用 Gfortran 作为 Windows 上 NumPy 的 Fortran 编译器,即使 C 编译器是 Visual Studio(VS 2005 及更高版本;VS 2003 将不起作用)。Gfortran + Visual Studio 不适用于 Windows 64 位系统(但 gcc + gfortran 可行)。目前尚不清楚在 x64 上是否完全可以使用 Gfortran 和 Visual Studio。
Windows 二进制文件的 arch 选项#
现在可以从命令行绕过自动架构检测,以安装超级包。
numpy-1.3.0-superpack-win32.exe /arch=nosse
将安装一个可在任何 x86 上运行的 NumPy,即使运行的计算机支持 SSE 集。
已弃用的功能#
直方图#
直方图的语义已修改,以修复与异常值处理相关的长期存在的问题。主要变化包括:
现在包含最右端边缘的仓边界的定义,以及
对上限异常值的处理,现在忽略而不是计入最右边的仓。
可以使用 new=False 访问之前的行为,但这已弃用,并将完全在 1.4.0 中删除。
文档更改#
添加了许多文档。用户指南和参考都可以从 Sphinx 构建。
新的 C API#
多维数组 API#
以下函数已添加到多维数组 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架构,这些定义在编译器解析头文件时设置,因此可用于交叉编译和多架构二进制文件。