当数据量庞大时,list列表速度很慢,使用numpy扩展库完成数组操作。基本对象为 ndarray:存储单一数据类型的多维数组(数据元素类型应一致,若不一致,会自动向下进行转换float,string)ufunc:对数组进行处理的通用函数
1.数组的创建a = np.array([1,2,3,4]) #单个列表创建一维数组b = np.array(((1,1,1),(2,2,2),(3.,3,3))) #嵌套元组创建二维数组print(b) #当输入元素含有整形与浮点型时,输出的数组元素都转换成浮点型
[[1、1、1.] [2、2、2.] [3、3、3.]]
# 使用arange,empty,linspace等函数生成数组a = np.arange(4,dtype=float) #创建浮点型数组[0.,1.,2.,3.]b = np.arange(0,10,2,dtype=int) #创建整型数组[0,2,4,6,8]c = np.empty((2,3),int) #创建2*3整形空矩阵# empty函数只分配数组所用内存,不对数组元素初始化,运行速度最快d = np.linspace(-1,2,5) #创建数组[-1,-0.25,0.5,1.25,2.]e = np.random.randint(0,3,(2,3)) #生成[0,3)上的2行3列的随机整型数组
2.数组的属性ndim 返回int数组的维数shape 返回元组,数组的尺寸 shape可以返回矩阵维度,相比于list更方便size 返回int,数组的元素总数,即shape中所有元素的乘积dtype 返回数据类型itemsize 返回int,每个元素的大小
a = np.random.randint(1,101,(3,5)) #生成1-100间的3行5列的随机整数数组print("维数ndim=",a.ndim)print("维度shape=",a.shape)print("元素总数size=",a.size)print("类型dtype=",a.dtype)print("每个元素字节数itemsize=",a.itemsize)
维数ndim= 2维度shape= (3, 5)元素总数size= 15类型dtype= int32每个元素字节数itemsize= 4
3.数组元素的索引1.切片操作与列表相同[start:end,step]2.列表元素引用为a[i][j],array元素引用为a[i,j],a[0:2,1:4]
# 布尔索引a = np.array([[1,np.nan,2],[4,np.nan,0]])b = a[~np.isnan(a)] #提取a中非nan的数print("b中大于1的有",b[b>1])
b中大于1的有 [2、4.]
# 花式索引# 一维数组的索引结果是对应位置元素a = np.array([1,2,3,4,5])a[[1,3]] # 二维数组的索引结果是对应下标的行a = np.array([[1,1],[2,2],[3,3],[4,4]])a[[0,2]]
array([[1, 1], [3, 3]])
4.数组的修改数组元素的修改 数组维数的扩大或缩小
# 数组元素的修改x = np.array([[0,0,0],[1,1,1],[2,2,2]])x[0,1] = -1 #修改第一行第二个元素为-1#删除行/列y = np.delete(x,0,axis=0) #删除数组的第0行print(y)z = np.delete(x,2,axis=1) #删除数组的第3列print(z)#增加行/列h = np.append(x,[[3,3,3]],axis=0) #增加一行print(h)l = np.append(x,[[0],[1],[2]],axis=1) #增加一列print(l)
[[1 1 1] [2 2 2]][[ 0 -1] [ 1 1] [ 2 2]][[ 0 -1 0] [ 1 1 1] [ 2 2 2] [ 3 3 3]][[ 0 -1 0 0] [ 1 1 1 1] [ 2 2 2 2]]
5.数组变形使用reshape函数改变数组的维度,指定数组在每个维度上的大小,同时不改变原始数据的值。若指定维度与size不吻合则抛出异常
a = np.arange(8)#reshape不改变原数组,返回视图print(a,'变形后:n',a.reshape(2,4))# resize将原数组改变,没有返回值print(a.resize(4,2),'变形后:n',a)
[0 1 2 3 4 5 6 7] 变形后: [[0 1 2 3] [4 5 6 7]]None 变形后: [[0 1] [2 3] [4 5] [6 7]]
6、数组的运算1.四则运算:对应元素+-*/ % // **运算2.比较运算3.ufunc通用函数:对数组中的元素逐个操作的函数,包括指数函数幂函数三角运算等等
# 1.简单四则运算a = np.arange(1,10)b = np.arange(11,20)print(b*a) #对应元素相乘# 整除的函数可以返回小数部分与整数部分print(np.modf(b/a)[0]) #对应元素相除的小数部分print(np.modf(a/b)[1]) #对应元素相除的整数部分
[ 11 24 39 56 75 96 119 144 171][0、 0、 0.33333333 0.5 0、 0.66666667 0.42857143 0.25 0.11111111][0、0、0、0、0、0、0、0、0.]
# 2.比较运算a = np.random.randint(0,10,(10,))b = np.random.randint(5,10,(10,))print(a[a>=b]) #取出a中 a>=b的所有元素print(a[a>7]) #取出a中 a>5的所有元素print(np.where(a>5,-1,a)) #将a中大于5的元素改为-1print(np.where(a>5,1,0)) #将a中大于5的元素改为1,否则为0
[8 5 6 8 9 6][8 8 9][-1 2 5 4 -1 5 -1 -1 2 -1][1 0 0 0 1 0 1 1 0 1]
# 3.ufunc函数的广播机制a = np.arange(0,20,10).reshape(-1,1)print(a)b = np.arange(0,3)print(b)print(a+b)
[[ 0] [10]][0 1 2][[ 0 1 2] [10 11 12]]
7.文件存取存取格式: 二进制文件:tofile,fromfile / load,save,savez 文本文件:savetxt,loadtxt若处理复杂数据结构,如缺失数据,可以用genfromtxt函数
# 1、文本文件的存取a = np.random.uniform(0,6,6).reshape(2,3) #生成2*3的均匀数组#写存 savetxt("文件名",数组)np.savetxt("D:/ndarray_data.txt",a,fmt="%d",delimiter=",") #保存为整数,以,分隔 #读取 loadtxt("文件名")b = np.loadtxt("D:/ndarray_data.txt",delimiter=",") #读取也以,分隔print(b)
[[4、3、0.] [0、0、3.]]
# 2、二进制文件存取a = np.arange(6).reshape(2,3)# tofile("文件名")输出的数据不保存数组形状和元素类型a.tofile("D:/ndarray_data.txt")# fromfile()读数据时需要指定元素类型,并对数组形状修改b = np.fromfile("D:/ndarray_data.txt",dtype=int).reshape(2,3)print(b)
[[0 1 2] [3 4 5]]