Python学习笔记(八)—— Array

xiaoxiao2021-02-28  258

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

转载请注明原文地址: https://www.6miu.com/read-19316.html

最新回复(0)