NumPy 1.3.0 发行说明#

这个次要版本包括大量错误修复、官方 python 2.6 支持以及一些新功能,例如通用 ufunc。

强调

Python 2.6 支持#

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

https://www.python.org/dev/peps/pep-0361/

广义 ufunc #

通常不仅需要循环标量上的函数,还需要循环向量(或数组)上的函数,如 http://scipy.org/scipy/numpy/wiki/GeneralLoopingFunctions上所述。我们建议通过泛化通用函数 (ufuncs) 来实现这一概念,并提供一个 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 现在可以使用 MS 编译器和 mingw-w64 编译器在 Windows 64 位(仅限 amd64,而不是 IA64)上构建:

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

新功能

格式问题#

浮点格式化现在由 numpy 而不是 C 运行时处理:这可以实现与区域设置无关的格式化,更强大的 fromstring 和相关方法。特殊值(inf 和 nan)在跨平台(nan 与 IND/NaN 等)之间也更加一致,并且与最近的 python 格式化工作(2.6 及更高版本)更加一致。

最大/最小的 Nan 处理#

最大/最小 ufunc 现在可以可靠地传播 nan。如果参数之一是 nan,则返回 nan。这会影响 np.min/np.max、amin/amax 和数组方法 max/min。添加了新的 ufunc fmax 和 fmin 来处理非传播 nan。

Nan 处理标志#

ufunc 符号现在返回 nan 作为 anan 的符号。

新的 ufunc #

  1. fmax - 与整数类型和非 nan 浮点数的最大值相同。如果一个参数为 nan,则返回非 nan 参数;如果两个参数均为 nan,则返回 nan。

  2. fmin - 与整数类型和非 nan 浮点数的最小值相同。如果一个参数为 nan,则返回非 nan 参数;如果两个参数均为 nan,则返回 nan。

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

  4. rad2deg - 将弧度转换为度数,与度数 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) 的支持

  • 使基类、共享掩码和硬掩码可供用户访问(但只读)

  • 文档更新

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 设置。

已弃用的功能#

直方图#

直方图的语义已被修改,以解决异常值处理方面长期存在的问题。主要变化涉及

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

  2. 上部异常值的处理,现在被忽略而不是记录在最右边的垃圾箱中。

仍然可以使用new=False访问以前的行为,但这已被弃用,并将在 1.4.0 中完全删除。

文档更改#

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

新的 C API #

多数组 API #

多数组 C API 中添加了以下函数:

  • PyArray_GetEndianness:获取运行时字节序

Ufunc API #

ufunc API 中添加了以下函数:

  • PyUFunc_FromFuncAndDataAndSignature:声明一个更通用的ufunc(广义ufunc)。

新定义#

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

  • NPY_CPU_X86:x86 架构(32 位)

  • NPY_CPU_AMD64:amd64 架构(x86_64,不是安腾)

  • 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:巴黎

还添加了用于 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 数学配置修改#

这将使移植到新平台变得更容易、更稳健。特别是,配置阶段不需要在目标平台上执行任何代码,这是迈向交叉编译的第一步。

https://www.numpy.org/neps/nep-0003-math_config_clean.html

umath 重构#

umath/ufunc 代码 (charris) 的大量代码清理。

构建警告的改进#

Numpy 现在可以使用 -W -Wall 进行构建而不会发出警告

https://www.numpy.org/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 时未设置),或者对于多架构二进制文件(例如 Max OS X 上的胖二进制文件)。

npy_endian.h 定义了 numpy 特定的字节顺序定义,以 glibc endian.h 为模型。 NPY_BYTE_ORDER 与 BYTE_ORDER 等效,并且定义了 NPY_LITTLE_ENDIAN 或 NPY_BIG_ENDIAN 之一。至于CPU架构,它们是在编译器解析标头时设置的,因此可用于交叉编译和多架构二进制文件。