Python学习笔记(八)—— Array

来源:互联网 发布:江西江铃集团 知乎 编辑:程序博客网 时间:2024/06/05 18:02

代码及内容源自《Fluent Python》——Luciano Ramalho 著

对于单纯的数值,array.array会比列表更高效。它不仅支持可变序列的所有操作(包括:.pop, .insert, .extend),也支持用于快速载入和保存的其他方法,如.frombytes和.tofile。创建array时,需要提供类型代号,并且Python不允许在array中放入任何与其类型不符的值。

>>> from array import array>>> from random import random>>> floats = array('d', (random() for i in range(10**7)))>>> fp=open('floats.bin','wb')>>> floats.tofile(fp)>>> fp.close()>>> floats2 = array('d')>>> fp=open('floats.bin','rb')>>> floats2.fromfile(fp,10**7)>>> fp.close()>>> floats2 == floats
True
>>> floats[-1]
0.9896395989961131
>>> floats2[-1]
0.9896395989961131

从这段代码可以看出,array.tofile和array.fromfile使用起来很方便。并且,如果你尝试运行一下这个例子(生成、保存、载入一千万个随机浮点数),就会发现它运行的非常快。实验表明,利用array.fromfile从二进制文件(由array.tofile创建)中载入一千万个双精度浮点数需要约0.1s,这几乎是从文本文件中读取相同数据量的速度的60倍。利用array.tofile保存的速度大约是向文本文件中每行写入一个浮点数的速度的7倍。

memoryview类是一个共享内存序列,可以使你在处理arrays时不需要复制字节。

>>> from array import array>>> numbers = array('h',[-2,-1,0,1,2])>>> memv = memoryview(numbers)>>> len(memv)
5
>>> memv[0]
-2
>>> memv_oct = memv.cast('B')
>>> memv_oct.tolist()
[254, 255, 255, 255, 0, 0, 1, 0, 2, 0]
>>> memv_oct[5]=4
>>> numbers
array('h', [-2, -1, 1024, 1, 2])

当然,如果你需要利用array来处理更高级的数值运算,那么应当使用NumPy和SciPy。事实上,对于高级数组和矩阵运算而言,NumPy和SciPy正是Python能够成为科学计算领域的主流语言的原因。
下面这个例子里展示了NumPy中二维数组的一些基本操作。

>>> import numpy>>> a=numpy.arange(12)>>> a
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
>>> type(a)
numpy.ndarray
>>> a.shape
(12,)
>>> a.shape=3,4>>> a
array([[ 0,  1,  2,  3],       [ 4,  5,  6,  7],       [ 8,  9, 10, 11]])
>>> a[2]
array([ 8,  9, 10, 11])
>>> a[2,1]
9
>>> a[:,1]
array([1, 5, 9])
>>> a.transpose()
array([[ 0,  4,  8],       [ 1,  5,  9],       [ 2,  6, 10],       [ 3,  7, 11]])

NumPy也支持加载、保存以及对所有元素的操作。

>>> floatnp=numpy.random.rand(10**7,)>>> floatnp[-3:]
array([ 0.0739906 ,  0.47402455,  0.37460871])
>>> floatnp *=.5>>> floatnp[-3:]
array([ 0.0369953 ,  0.23701227,  0.18730435])
>>> from time import perf_counter as pc>>> t0=pc(); floatnp/=3; pc()-t0 #计算操作的耗时(秒)
0.026482352083847
>>> numpy.save('floats-10M',floatnp)
>>> floatnp2=numpy.load('floats-10M.npy','r+')>>> floatnp2*=6>>> floatnp2[-3:]
memmap([ 0.0739906 ,  0.47402455,  0.37460871])

这里只是展示了NumPy最简单的内容,因为对于Python的array而言,如果不对NumPy做一个简单的介绍那将是不完整的。NumPy和SciPy都是非常强大的库,同时也是其他优秀工具如Pandas和Blaze的基础,值得用一整本书来介绍。