Python学习笔记(八)—— Array

代码及内容源自《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的基础,值得用一整本书来介绍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值