要了解 Numerical Python 软件包的第一件事情是,Numerical Python 不会让您去做标准 Python 不能完成的任何工作。它只是让您 以快得多的速度去完成标准 Python 能够完成的相同任务。实际上不仅仅如此;许多数组操作用 Numeric 或者 Numarray 来表达比起用标准 Python 数据类型和语法来表达要优雅得多。不过,惊人的速度才是吸引用户使用 Numerical Python 的主要原因。
其实,Numerical Python 只是实现了一个新的数据类型:数组。与可以包含不同类型元素的列表、元组和词典不同的是,Numarray 数组只能包含同一类型的数据。Numarray 数组的另一个优点是,它可以是多维的 -- 但是数组的维度与列表的简单嵌套稍有不同。Numerical Python 借鉴了程序员的实践经验(尤其是那些有科学计算背景的程序员,他们抽象出了 APL、FORTRAN、MATLAB 和 S 等语言中数组的最佳功能),创建了可以灵活改变形状和维度的数组。我们很快会回来继续这一话题。
在 Numerical Python 中对数组的操作是 按元素进行的。虽然二维数组与线性代数中的矩阵类似,但是对它们的操作 (比如乘) 与线性代数中的操作 (比如矩阵乘) 是完全不同的。
让我们来看一个关于上述问题的的具体例子。在纯 Python 中,您可以这样创建一个“二维列表”:
清单 1. Python 的嵌套数组
>>> pyarr = [[1,2,3],... [4,5,6],... [7,8,9]]>>> print pyarr[[1, 2, 3], [4, 5, 6], [7, 8, 9]]>>> pyarr[1][1] = 0>>> print pyarr[[1, 2, 3], [4, 0, 6], [7, 8, 9]]
很好,但是您对这种结构所能做的只是通过单独的 (或者多维的) 索引来设置和检索元素。与此相比,Numarray 数组要更灵活:
清单 2. Numerical Python 数组
>>> from numarray import *>>> numarr = array(pyarr)>>> print numarr[[1 2 3] [4 0 6] [7 8 9]]
改变并不大,但是使用 Numarray 进行的操作如何呢? 下面是一个例子:
清单 3. 元素操作
>>> numarr2 = numarr * 2>>> print numarr2[[ 2 4 6] [ 8 0 12] [14 16 18]]>>> print numarr2 + numarr[[ 3 6 9] [12 0 18] [21 24 27]]
改变数组的形状:
清单 4. 改变形状
>>> numarr2.shape = (9,)>>> print numarr2[ 2 4 6 8 0 12 14 16 18]
Numeric 与 Numarray 之间的区别
总体来看,新的 Numarray 软件包与早期的 Numeric 是 API 兼容的。不过,开发者基于用户经验进行了一些与 Numric 并不兼容的改进。开发者没有破坏任何依赖于 Numeric 的应用程序,而是开创了一个叫做 Numarray 的新项目。在完成本文时,Numarray 还缺少 Numeric 的一些功能,但是已计划实现这些功能。
Numarray 所做的一些改进:
新闻热点
疑难解答