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的基础,值得用一整本书来介绍。
- Python学习笔记(八)—— Array
- [Python]Python学习笔记(八)——问题
- Python学习笔记(八)——Python 异常处理
- Python学习笔记—八皇后问题
- Python学习笔记(八)——错误、调试、测试
- Python学习笔记(八)——文件I/O
- python学习笔记(八)——函数
- Python学习笔记(八)—切片(slicing)
- nginx 源码学习笔记(八)——基本容器——array数组
- nginx 源码学习笔记(八)——基本容器——array数组
- python 学习笔记(八)
- Python学习笔记(八)
- Python学习笔记(八)
- Python学习笔记(八)
- Python学习笔记【八】——《python基础教程》:: 异常
- Python 学习笔记之八——输入和输出
- Python学习笔记(八)异常
- python学习笔记之(八)
- Centos下Nginx安装
- iOS-Core Bluetooth Background Processing for iOS Apps(API Reference) the fifth part
- "海潮音"排序算法:再来个中国造,业余爱好设计的作品
- “师创杯”SDUT-ACM校赛热身赛-疯狂的bLue
- 终极解决方案:在webview中跳转支付宝出错,net::ERR_UNKNOWN_URL_SCHEME
- Python学习笔记(八)—— Array
- FastDFS服务器
- Android开发之NDK/JNI的hello world
- 火狐浏览器 window.getComputedStyle()返回值的问题
- python使用PyCharm调试Scrapy程序
- 二叉树的一些基本操作
- XGBoost 与 Boosted Tree
- Zynq-Linux移植学习笔记之七-网络驱动
- tomcat服务器重装与myeclipse JavaWeb开发的几点注意事项