一 什么是数组?
数组是一种顺序表,在内存中是一串连续的一套地址,用来存储数据,是1对1的数据结构。
在python中,数组list是天生的动态数组,在java里面叫做arraylist。
二 数组中元素如何存储?
连续存储。
在java或者C++中,数组只能存放同一种类型的数据,但python中可以存放各种类型数据。
这是因为python数组中存放的是数据存放的地址,地址的数据类型是一样的,而数组中存放地址的地址自然也是连续的,这样就实现了用数组存放各种类型数据。
但同时也会造成一个问题,就是花费了更大的存储开销,而且当要用到2维数组即矩阵,或者更高维数组如n维张量时,这种结构显然低效,而且python也不支持多维数组,也没有各种运算函数,但用C语言写的numpy解决了这些问题,numpy支持n维数组,即支持ndarray,因为最低是二维数组,二维数组即是矩阵,故可看作numpy支持矩阵以及矩阵运算,也就是说,哪怕在numpy写一个1维数组,那它也是行矩阵或列矩阵,当然三维数组就是将矩阵(二维数组)放在了一个更大的数组里面,可依次类推。
同时numpy也支持各种针对n维数组的运算,提供大量n维数组运算的函数库。但是numpy是不支持gpu加速运算的,因此使用tensorflow通过gpu加速。一般当数组维度达到3维及以上时,可以叫做张量(tensor).
在tensorflow中,所有数组都可以叫做tensor,
如:1维数组=1维张量,二维数组=矩阵=2维张量,三维数组=3维张量,依此类推。
因此业界一般使用tensorflow-gpu来进行张量计算,但是numpy可用来进行数据预处理,并且numpy的ndarray也能被tensorflow转化为tensor使用。
一维数组存储地址计算:a[i]为,数组首地址+i*一个数组元素字节所占长度。
三 python数组的基本操作
1.增加元素分3种:
增加方式 | 代码 | 时间复杂度 |
---|---|---|
尾部增加 | list.append(‘item’) | O(1) |
头部增加 | list.insert(0,’item’) | O(n) |
中间增加 | list.insert(2,’item’) | O(n) |
2.删除元素分3种:
增加方式 | 代码 | 时间复杂度 |
---|---|---|
尾部删除 | list.pop() | O(1) |
头部删除 | list.pop(0) | O(n) |
中间删除 | list.pop(2) | O(n) |
3.修改元素:时间复杂度O(1),按索引修改
如:list[0] = ‘item2’
4.查找元素:时间复杂度O(1),按索引查找,
如:list[0] = ‘item2’
为什么python数组增删时间复杂度是O(n)?
因为增删时数据的拷贝覆盖,如头部增加就要把所有数组元素向后移动一个位置,然后再把元素增加到头部,中间增加是相同的道理。
基于此,若增删操作很少,查改操作很多,又不会out of memory,可采用数组存储数据。