NumPy 1.3.0 发行说明#

此小版本包括了大量的错误修复,官方的 Python 2.6 支持以及一些新功能,例如广义 ufuncs.

亮点#

Python 2.6 支持#

Python 2.6 现在在所有先前支持的平台上都得到支持,包括 Windows.

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

广义 ufuncs#

通常需要不仅对标量函数进行循环,而且还需要对向量(或数组)函数进行循环,如 http://scipy.org/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) 的输出. 底层基本函数被调用 35 次. 在签名中,我们为每个输入指定一个核心维度 (i) ,为输出指定零核心维度 () ,因为它接受两个 1-d 数组并返回一个标量. 通过使用相同的名称 i ,我们指定两个对应的维度应具有相同的大小(或者其中一个的大小为 1 并且将被广播).

超出核心维度的维度称为“循环”维度. 在上面的例子中,这对应于 (3,5) .

通常的 numpy “广播”规则适用,其中签名确定每个输入/输出对象的维度如何拆分为核心维度和循环维度:

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

实验性的 Windows 64 位支持#

现在可以在 Windows 64 位(仅限 amd64,不包括 IA64)上构建 Numpy,同时支持 MS 编译器和 mingw-w64 编译器:

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

新功能#

格式化问题#

浮点格式化现在由 numpy 而不是 C 运行时处理:这实现了独立于区域设置的格式化,更加强大的 fromstring 和相关方法. 特殊值(inf 和 nan)在不同平台(nan vs IND/NaN 等…)上更加一致,并且与最近的 python 格式化工作(在 2.6 及更高版本中)更加一致.

max/min 中的 Nan 处理#

maximum/minimum ufuncs 现在可以可靠地传播 nans. 如果其中一个参数是 nan,则返回 nan. 这会影响 np.min/np.max , amin/amax 和数组方法 max/min . 新的 ufuncs fmaxfmin 已被添加,以处理非传播 nans.

sign 中的 Nan 处理#

ufunc sign 现在对于 anan 的 sign 返回 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 为底的对数.

掩码数组#

一些新特性和bug修复,包括:

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

  • 小的 bug 修复 (r6356, r6352, r6335, r6299, r6298)

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

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

  • 文档更新

gfortran 在 windows 上的支持#

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

windows 二进制文件的 Arch 选项#

现在可以通过命令行绕过超级包安装的自动 arch 检测:

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

将安装一个可在任何 x86 上运行的 numpy,即使运行计算机支持 SSE 集.

弃用的特性#

直方图#

修改了直方图的语义,以修复长期存在的异常值处理问题.主要的更改涉及

  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).

新的定义#

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

  • NPY_CPU_X86: x86 arch (32 bits)

  • NPY_CPU_AMD64: amd64 arch (x86_64, NOT Itanium)

  • NPY_CPU_PPC: 32 bits 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://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 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 架构,这些定义在编译器解析标头时进行设置,因此可用于交叉编译和多架构二进制文件.