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)来实现这一概念,并提供一个增加约500行代码到numpy代码库的C语言实现.在当前(专门的)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)”,并为输出指定零个核心维度 “()”,因为它接受两个 1-d 数组并返回一个标量.通过使用相同的名字 “i”,我们指定两个相应的维度应具有相同的大小(或者其中一个的大小为 1 并且将被广播).

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

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

当一个输入数组的维度小于相应的核心维度数量时,1’s 会被添加到其形状的前面.核心维度从所有输入中移除,剩下的维度进行广播;定义循环维度.输出由循环维度加上输出核心维度给出.

实验性 Windows 64 位支持#

Numpy 现在可以在 Windows 64 位(仅限 amd64,不包括 IA64)上使用 MS 编译器和 mingw-w64 编译器进行构建:

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

新功能#

格式问题#

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

max/min 中的 NaN 处理#

最大/最小 ufuncs 现在可靠地传播 nans.如果其中一个参数是 nan,则返回 nan.这影响 np.min/np.max、amin/amax 和数组方法 max/min.新增了 ufuncs fmax 和 fmin 来处理不传播的 nans.

符号中的NaN处理#

ufunc sign 现在对 nan 的符号返回 nan.

新的 ufuncs#

  1. fmax - 对于整数类型和非nan浮点数,与最大值相同.如果一个参数是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 对用户可访问(但只读)

  • 文档更新

Windows 上的 gfortran 支持#

Gfortran 现在可以作为 Windows 上的 fortran 编译器用于 numpy,即使 C 编译器是 Visual Studio(VS 2005 及以上版本;VS 2003 将无法工作).Gfortran + Visual Studio 在 64 位 Windows 上无法工作(但 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#

Multiarray API#

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

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

Ufunc API#

以下函数已添加到 ufunc API 中:

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

新定义#

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

  • 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 数学配置重构#

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

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

独立的内核数学库#

核心数学函数(sin、cos 等… 用于基本 C 类型)已被放入一个单独的库中;它作为一个兼容层,以支持大多数 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 架构,这些在编译器解析头文件时设置,因此可以用于交叉编译和多架构二进制文件.