分享
 
 
 

使用Numeric软件包和Numarray软件包

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

Numerical Python (通常称为 NumPy) 是一个广为应用的 Python 扩展库,用于快速处理任意维数的固定类型数组。由于底层代码是充分优化的 C 语言代码,因而对数组的主要操作在 NumPy 调用中执行时,速度不再受到 Python 解释器的限制。因为 NumPy 已经取得了这样的成功,所以 NumPy 的开发者将用一个叫做 Numarray 的新模块来取代 NumPy,新模块基本上 (但并不是完全) 与 NumPy 兼容。在本文中,David 介绍了 NumPy 的一般功能,以及 Numarray 将要带来的一些特殊改进。

要了解 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 所做的一些改进:

以分层的类结构来组织元素类型,以支持 isinstance() 检验。Numeric 在指定数据类型时只使用字符类型编码 (但是 Numarray 中的初始化软件仍然接受老的字符编码)。

改变了类型强制规则,以保持数组(更为常见)中的类型 ,而不是转换为 Python 标量的类型。

出现了附加的数组属性 (不再只有 getter 和 setter)。

实现了更灵活的异常处理。

新用户不必担心这些变化,就这一点来说,最好一开始就使用 Numarray 而不是 Numeric。

计时的例子

让我们来感受一下在 Numerical Python 中的操作相对于标准 Python 的速度优势。作为一个“演示任务”,我们将创建一个数字序列,然后使它们加倍。首先是标准 Python 方法的一些变体:

清单 5. 对纯 Python 操作的计时

def timer(fun, n, comment=""):

from time import clock

start = clock()

print comment, len(fun(n)), "elements",

print "in %.2f seconds" % (clock()-start)

def double1(n): return map(lambda n: 2*n, xrange(n))

timer(double1, 5000000, "Running map() on xrange iterator:")

def double2(n): return [2*n for n in xrange(n)]

timer(double2, 5000000, "Running listcomp on xrange iter: ")

def double3(n):

double = []

for n in xrange(n):

double.append(2*n)

return double

timer(double3, 5000000, "Building new list from iterator: ")

我们可以看出 map() 方法、list comprehension 和传统循环方法之间的速度差别。那么,需要同类元素类型的标准 array 模块呢?它可能会更快一些:

清单 6. 对标准 array 模块的计时

import array

def double4(n): return [2*n for n in array.array('i',range(n))]

timer(double4, 5000000, "Running listcomp on array.array: ")

最后我们来看 Numarray 的速度如何。作为额外对照,我们来看如果必须要将数组还原为一个标准的列表时,它是否同样具有优势:

清单 7. 对 Numarray 操作的计时

from numarray import *

def double5(n): return 2*arange(n)

timer(double5, 5000000, "Numarray scalar multiplication:

")

def double6(n): return (2*arange(n)).tolist()

timer(double6, 5000000, "Numarray mult, returning list:

")

现在运行它:

清单 8. 比较结果

$ python2.3 timing.py

Running map() on xrange iterator: 5000000 elements in 13.61 seconds

Running listcomp on xrange iter:

5000000 elements in 16.46 seconds

Building new list from iterator:

5000000 elements in 20.13 seconds

Running listcomp on array.array:

5000000 elements in 25.58 seconds

Numarray scalar multiplication:

5000000 elements in 0.61 seconds

Numarray mult, returning list:

5000000 elements in 3.70 seconds

处理列表的不同技术之间的速度差异不大,也许还是值得注意,因为这是尝试标准的 array 模块时的方法问题。但是 Numarray 一般用不到 1/20 的时间内就可以完成操作。将数组还原为标准列表损失了很大的速度优势。

不应通过这样一个简单的比较就得出结论,但是这种加速可能是典型的。对大规模科学计算来说,将计算的时间由几个月下降到几天或者从几天下降到几个小时,是非常有价值的。

系统建模

Numerical Python 的典型用例是科学建模,或者可能是相关领域,比如图形处理和旋转,或者信号处理。我将通过一个比较实际的问题来说明 Numarray 的许多功能。假设您有一个参量可变的三维物理空间。抽象地说,任何参数化空间,不论有多少维,Numarray 都适用。实际上很容易想像,比如一个房间,它的各个点的温度是不同的。我在 New England 的家已经到了冬天,因而这个问题似乎更有现实意义。

为简单起见,下面我给出的例子中使用的是较小的数组(虽然这可能是显然的,但是还是有必要明确地指出来)。不过,即使是处理有上百万个元素而不仅仅是几十个元素的数组,Numarray 也还是很快;前者可能在真正的科学模型中更为常见。

首先,我们来创建一个“房间”。有很多方法可以完成这项任务,但是最常用的还是使用可调用的 array() 方法。使用这个方法,我们可以生成具有多种初始化参数 (包括来自任何 Python 序列的初始数据) 的 Numerical 数组。不过对于我们的房间来说,用 zeros() 函数就可以生成一个温度均匀的寒冷房间:

清单 9. 初始化房间的温度

from numarray import *

room = zeros((4,3,5),Float)

print room

[[[ 0. 0. 0. 0. 0.]

[ 0. 0. 0. 0. 0.]

[ 0. 0. 0. 0. 0.]]

[[ 0. 0. 0. 0. 0.]

[ 0. 0. 0. 0. 0.]

[ 0. 0. 0. 0. 0.]]

[[ 0. 0. 0. 0. 0.]

[ 0. 0. 0. 0. 0.]

[ 0. 0. 0. 0. 0.]]

[[ 0. 0. 0. 0. 0.]

[ 0. 0. 0. 0. 0.]

[ 0. 0. 0. 0. 0.]]]

自上而下每一个二维的“矩阵”代表三维房间的一个水平层面。

首先,我们将整个房间的温度提高到比较舒适的 70 华氏度 (大约是 20 摄氏度):

清单 10. 打开加热器

room += 70

print room

[[[ 70. 70. 70. 70. 70.]

[ 70. 70. 70. 70. 70.]

[ 70. 70. 70. 70. 70.]]

[[ 70. 70. 70. 70. 70.]

[ 70. 70. 70. 70. 70.]

[ 70. 70. 70. 70. 70.]]

[[ 70. 70. 70. 70. 70.]

[ 70. 70. 70. 70. 70.]

[ 70. 70. 70. 70

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有