1、列表
list是处理一组有序项目的数据结构,即你可以在一个列表中存储一个序列的项目。列表中的项目。列表中的项目应该包括在方括号中,这样python就知道你是在指明一个列表。一旦你创建了一个列表,你就可以添加,删除,或者是搜索列表中的项目。由于你可以增加或删除项目,我们说列表是可变的数据类型,即这种类型是可以被改变的,并且列表是可以嵌套的。
列表是可以改变的,能够增加或减少,(append和del函数)
2、数组(array)
Numpy是专门针对数组的操作和运算进行了设计,所以数组的存储效率和输入输出性能远优于Python中的嵌套列表,数组越大,Numpy的优势就越明显。通常Numpy数组中的所有元素的类型都是相同的,而Python列表中的元素类型是任意的,所以在通用性能方面Numpy数组不及Python列表,但在科学计算中,可以省掉很多循环语句,代码使用方面比Python列表简单的多。
在list中的数据类型保存的是数据的存放的地址,简单的说就是指针,并非数据,这样保存一个list就太麻烦了,例如list1=[1,2,3,‘a’]需要4个指针和四个数据,增加了存储和消耗cpu。
numpy中封装的array有很强大的功能,里面存放的都是相同的数据类型
3、程序举例
3.1 创建
列表list的创建:
x = list()
x.append(1)
x.extend([2,3,4])
print(x)
x = [1,2,3,4,5]
print(x)
这里需要注意append和extend的区别,append将所有内容当做一个元素加入到列表的后面。
numpy数组创建:
import numpy as np
#常规创建
a=np.array((1,2,3))#参数是tuple
b=np.array([6,7,8])#参数是list
c=np.array([[1,2,3],[4,5,6]])#参数是二维list
#其他方法创建
arr1=np.arange(1,10,1)
arr2=np.linspace(1,10,10)
- np.arange(a,b,c)表示产生从a-b不包括b,间隔为c的一个array,数据类型默认是int32。
- linspace(a,b,c)表示的是把a-b平均分成c分,它包括b
3.2 元素访问
3.2.1一维数组、列表访问
列表索引
x = [0,1,2,3,4,5,6,7,8,9]
print(x[5])
print(x[1:3])
print(x[5:])
print(x[-1])
print(x[1:-1:2])
print(x[::-1])
numpy数组的访问
x = [0,1,2,3,4,5,6,7,8,9]
x = np.array(x)
print(x[5])
print(x[1:3])
print(x[5:])
print(x[-1])
print(x[1:-1:2])
print(x[::-1])
3.2.2 二维数组、列表访问
对于二维数组arr=np.array([[1,2,3],[4,5,6]])举例
列表:
x = [[1,2,3],[4,5,6]]
print(x[1:2])
print(x[1:2][0])
print(x[1])
print(x[0][0])
数组:
x=np.array([[1,2,3],[4,5,6]])
print(x[1:2])
print(x[1:2][0])
print(x[1])
print(x[0][0])
print(x[0,0])
区别:在列表list中,不能使用x[0,0,]来访问第1行第一列的元素,只能使用x[0,0]。
3.3 浅拷贝与深拷贝
numpy数组:
array的索引最终产生的是一个「 原始数据的浅拷贝」,他和原始数据共用一块内存。当我们修改了b的第一个元素的时候,a的第一个元素也被修改了。因为他们都是指向的同一个内存。
这是因为当我们执行b=a[:2]等语句的时候,拷贝的是指向这个元素的指针,当我们想要修改的时候,也是修改了指针指向的元素值。
import numpy as np
a=np.array([0,1,2,3])
b=a[:2]
a[0] = 100
print(a)
print(b)
结果:
[100 1 2 3]
[100 1]
list列表:
list对象在执行的时候拷贝了数据与指针,就不会有这种状况啦。
a=[0,1,2,3]
b=a[:2]
a[0] = 100
print(a)
print(b)
结果:
[100, 1, 2, 3]
[0, 1]
但是,对于列表,如果直接使用b = a,同样是浅拷贝,可以使用b = a[ : ]