数据结构(一)——数组

数组

数组可以说是一种最简单的数据结构,它占据一块连续内存并按照顺序存储数据。我们在创建数组是要首先指定数组的空间大小,假如我们只在这个数组中存储一个数据,那也是占据着整块内存,所以它的空间效率并不高。因为数组中的内存是连续的,所以我们可以下标在O(l)时间读写任何元素,因此它的时间效率是很高的。
我们可以根据数组时间效率高的优点,用数组来实现简单的哈希表:把数组的下标设为哈希表的键值(Key),而把数组中的每一个数字设为哈希表的值,这样每一个下标及数组中该下标对应的数字就组成了一个“键值——值”的配对。有了这样的哈希表,我们就可以在O(l)时间内实现查找,从而快速、高效地解决很多问题,
下面来看下Python中数组的应用情况:
标准的Python中用列表list保存一组值,可以用来当作数组使用,但由于列表的元素可以是任何对象,因此列表中保存的是对象的指针。这样的话,对于数值运算,这种结构显然比较浪费内存和cpu计算时间。
此外,Python还提供了array模块,它所提供的array对象和列表不同,能直接保存数值,和C的一维数组类似。但是由于它不支持多维数组,也没有各种运算函数。
然后Numpy的诞生弥补了这些不足。Numpy提供了ndarray和ufunc两种基本的对象。
下面挨个来看这三种形式。
一、列表list
Python列表的存储形式就是以数组array的形式进行存储的而不是链表,然后每一个元素其实存储的是列表对象的指针。每次存储元素的空间使用完之后,将动态分配原有储存空间两倍的大小的新内存作为存储空间。
它是可变对象,类似C#中的ArrayList,C++中的vector,用于顺序存储,并且可以存储不同类型的数据。
索引从0开始,也可以用负索引,-1表示最后一个元素。

(1)list的存储

这里写图片描述

注意下面这种情况:

这里写图片描述
这里写图片描述

这里a和b作用相当于指针,指向数据所在位置的地址,li = [a, b]之后,列表中就已经存储好了数据的地址,虽然后面a指向的内容变了,但是列表中存放的地址没变还是原来的地址,所以列表中的数据没变。

(2)list的方法

li = [3,5,'hello']
li.append(var)   #向结尾追加数据
li.insert(index,var#向index位置处插入数据var
li.pop(index)       #返回元素,并从list中删除之,若没参数,默认最后一个
li.remove(var)     #删除第一次出现的该元素
li.count(var)      #该元素在列表中出现的个数
li.index(var)      #返回该元素的位置,无则抛出异常
li.extend(list)    #在结尾追加list,即将li和list进行拼接合并(等同于:li+list)
li.sort()       #排序,默认从小到大(key=None, reverse=False),其中可以通过key参数指定排序的关键字,并且key后面一般跟的是一个方法,eg:key=len
li.reverse()     #倒序

同时来看下list其他的一些操作:

li1 = li      #列表的复制
li2 = li[:]     #利用切片进行列表复制
del li2[1]      #删除指定位置元素
[2]*4     #[2,2,2,2]

二、array模块

这个模块貌似用的比较少,我几乎没用过,所以现在就是照着网上的一些介绍来大概记录下array模块的用法。
上面提到的list,可以存放各种类型的数据,但是array不行,在创建array数组时需要用类型代码来指定这个array里面存放数据的类型,也就是一个array中存储的是相同类型的数据。
array能直接存放数据,这点于list也不同。
这里写图片描述

import array
#array.array(typecode,[initializer])——typecode:元素类型代码;initializer:初始化器,若数组为空,则省略初始化器。
arr = array.array('i',[0,1,1,2,3])
print(arr)

方法啥的不说了,如果后面用到了再补充吧。

三、numpy.array

numpy是Python的一个科学计算模块,在numpy中,使用ndarray对象表示数组,它是整个库的核心,numpy中所有的操作都围绕ndarray对象进行处理。
ndarray 是存储单一数据类型的多维数组。
首先需要创建数组,可以利用array()函数

import numpy as np
a = np.array([1,2,3])
b = np.array([[2,3,4],[3,4,5]])
print (a,b)

结果

array([1,2,3])
array([[2,3,4],[3,4,5]])

数组的形状可以通过shape属性来获得,它是一个描述数组各个轴的长度的元祖

print(a.shape,b.shape)

结果:

(3,)    #有一个元素表示是一维数组,shape的元组里有几个元素就表示这个数组是几维的
(2,3)

还可以通过修改数组的shape属性,在保持数组元素个数不变的情况下,改变数组每个轴的长度,

b.shape = 3,2

再看b

array([[2, 3],
       [4, 3],
       [4, 5]])

注意从(2,3)改成(3,2)并不是对数组进行转置,而只是改变每个轴的大小,数组元素在内存中的位置并没有改变。
当设置某个轴的元素个数为-1时,将自动计算此轴的长度。由于数组b有6个元素,因此下面的程序将数组b的shape属性改成了(1,6):

b.shape = 6,-1
array([[2],
       [3],
       [4],
       [3],
       [4],
       [5]])

使用数组的reshape()方法,可以创建指定形状的新数组,而原数组的形状保持不变

c = a.reshape((3,1))
>>> c
array([[1],
       [2],
       [3]])
>>> a
array([1, 2, 3])

数组a和c其实共享数据存储空间,因此修改其中任意一个数组的元素都会同时修改另一个数组的内容:

>>> a[1] = 100
>>> a
array([  1, 100,  3])
>>> c
array([[  1],
       [100],
       [  3]])
>>> 

其他有关多维数组的知识请去看numpy学习系列哦~~~~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值