目录
2.1 数值计算工具 Numpy
2.1.1数组的创建,属性和操作
1.数组的创建
例2.1 利用array函数创建数组示例
import numpy as np
a = np.array([2,4,8,20,16,30])
#如果向array函数传入了一个列表或元组,将构造简单的一维数组
b = np.array(((1,2,3,4,5),(6,7,8,9,10),(10,9,1,2,3),(4,5,6,8,9.0)))
#如果传入多个嵌套的列表或元组,将构造一个二维数组
#注意括号,array函数本身有一层括号,传入列表有一层中括号,传入元组有一层小括号,如果是嵌套的元组,则嵌套有一层多出来的括号
print('一维数组:',a)
#逗号分隔,表示输出多个对象
print('二维数组:\n',b)
#print函数的用法,格式如下:
#print(*objects, sep=' ', end='\n', file=sys.stdout)
#objects --表示输出的对象。输出多个对象时,需要用 , (逗号)分隔。
#sep -- 用来间隔多个对象。
#end -- 用来设定以什么结尾。默认值是换行符 \n,我们可以换成其他字符。
#file -- 要写入的文件对象。
例2.2 利用arange,empty,linspace等函数生成数组示例
import numpy as np
a=np.arange(4,dtype=float)#创建[0,4)的浮点数数组
b=np.arange(0,10,2,dtype=int)#创建[0,10)间隔为2的整型数组
c=np.linspace(-1,2,5)#创建一个数组,元素为[0,2]均分为5份
d=np.empty((2,3),int)#创建一个2*3的空数组
#empty函数只分配内存,不初始化,速度最快,返回值随机
e=np.random.randint(0,3,(2,3))#创建一个2*3的随机数组,再[0,3)上取值
print(a),print(b),print(c),print(d),print(e)
例 2.3 使用虚数单位“j”生成数组
import numpy as np
a=np.linspace(0,2,5)#创建一个数组,元素为[0,2]均分为5份
b=np.mgrid[0:2:5j]#等价于np.linspace(0,2,5)
x,y=np.mgrid[0:2:4j,10:20:5j]#生成x数组,[0,2] 生成y数组,[10,20]
print(a),print(b)
print('x={}\ny={}'.format(x,y))#format方法用参数分别替换前面的{}
2.数组的属性
例2.4 生成一个3*5的[1,10]上取值的随机整数矩阵,并显示他的各个属性
知识点:数组的属性如下所示
- ndim 返回值int,表示数组的维数
- shape 返回值元组,表示数组的尺寸,eg:(3,4)表示3行4列矩阵
- size 返回值int,表示数组的元素总数
- dtype 返回数据类型
- itemsize 返回值int,表示每个元素的大小(字节)
import numpy as np
a=np.random.randint(1,11,(3,5))
print('维数:{}'.format(a.ndim))
print('维度:{}'.format(a.shape))
print('元素总数:{}'.format(a.size))
print('类型:{}'.format(a.dtype))
print('每个元素字节数:{}'.format(a.itemsize))
例2.5 生成数学上一维向量的三种模式
import numpy as np
a=np.array([1,2,3])
b=np.array([[1,2,3]])
c=np.array([[1],[2],[3]])
print(a,a.shape),print(b,b.shape),print(c,c.shape)
3.数组元素的索引
- 一般索引
import numpy as np
a=np.array([2,4,8,20,16,30])
b=np.array(((1,2,3,4,5),(6,7,8,9,10),(10,9,1,2,3),(4,5,6,8,9.0)))
print(a)
print('-------------------------')
print(b)
print('-------------------------')
print(a[[2,3,5]]) #一维数组索引,输出[ 8 20 30]
print('-------------------------')
print(a[[-1,-2,-3]])#一维数组索引,输出[30 16 20]\
print('-------------------------')
print(b[1,2]) #二维数组索引,输出第二行第三列元素
print('-------------------------')
print(b[2]) #二维数组索引,输出第三行元素
print('-------------------------')
print(b[2,:]) #二维数组索引,输出第三行元素
print('-------------------------')
print(b[:,1]) #二维数组索引,输出第二列元素
print('-------------------------')
print(b[[2,3],1:4]) #输出第3、4行,第2、3、4列元素(列表前后取,切片后不取)
print('-------------------------')
print(b[1:3,1:3]) #输出第2、3行,第2、3列元素
如上述结果所示,在一维数组的索引中,可以将任意位置的索引组装为列表,用作对应元素的获取;在二维数组中,位置索引必须写成[rows,cols]的形式,方括号的前半部分用于控制二维数组的行索引,后半部分用于控制数组的列索引.如果需要获取所有的行或列元素,那么,对应的行索引或列索引需要用英文状态的冒号表示.
- 布尔索引
from numpy import array,nan,isnan
a=array([[1,nan,2],[4,nan,3]])
b=a[~isnan(a)] #~表示取反
print("b=",b)
print('b中大于2的元素有:',b[b>2])
- 花式索引
from numpy import array x = array([[1,2],[3,4],[5,6]]) print('前两行元素为:\n',x[[0,1]]) print('x[0][0]和x[1][1]为:',x[[0,1],[0,1]]) #下面两种格式是一样的 print(x[[0,1]][:,[0,1]]) print(x[0:2,0:2])
花式索引的索引值是一个数组.对于使用一维整型数组作为索引,如果被索引
数据是一维数组,那么索引的结果就是对应位置的元素;如果被索引数掂足--维蚁组,那么索引的结果就是对应下标的行.
对于二维被索引数据来说,索引值可以是二维数据,当索引值为两个维度相同
的一维数组组成的二维数组时,以两个维度作为横纵坐标索引出单值后组合成新的一维数组.
4.数组的修改
(这里指的是数组元素的修改和维度的扩大和缩小)
import numpy as np
x = np.array([[1,2],[3,4],[5,6]])
x[2,0] = -1#把第三行第一列元素的值修改为-1
y=np.delete(x,2,axis=0)
print(y)#删除数组的第三行
z=np.delete(y,0,axis=1)
print(z)#删除数组的第一列
t1=np.append(x,[[7,8]],axis=0)
print(t1)#给数组x增加一行,内容为[7,8]
t2=np.append(x,[[9],[10],[11]],axis=1)
print(t2)#给数组x增加一列,内容为[9,10,11]
- 直接修改:
用一般索引直接修改即可
- 删除一行(列):
numpy.delete()函数,其中有三个参数: 第一个参数:进行操作的数组名称;第二个参数:行号(列号);第三个参数:axis=0即修改行,axis=1即修改列。
- 增加一行(一列):
numpy.append()函数,其中有三个参数: 第一个参数:进行操作的数组名称;第二个参数:要增加的内容。注意,最外层一个中括号,内部增加行时一个中括号括住全部元素即可,增加列时一个中括号括一个元素;第三个参数:axis=0即修改行,axis=1即修改列。
5.数组的变形
例2.10 reshape和resize变形示例
import numpy as np
a = np.arange(4).reshape(2,2)#生成数组[[0,1][2,3]]
b = np.arange(4).reshape(2,2)#生成数组[[0,1][2,3]]
print(a.reshape(4,),'\n',a)#输出[0,1,2,3]和[[0,1][2,3]]
print(b.resize(4,),'\n',b)#输出none和[0,1,2,3]
reshape和resize在数组变形方面的区别:
1.reshape函数最多三个参数,a.reshape(m,n,s),即把数组a变为m个n行s列的数组。如果只给两个参数,为n,s。返回值为改变的结果,不修改原数组。
2.resize函数最多三个参数,a.resize(m,n,s),即把数组a变为m个n行s列的数组。如果只给两个参数,为n,s。没有返回值,修改原数组。
例2.11 数组降维示例
import numpy as np
a=np.arange(4).reshape(2,2)#生成数组[[0,1][2,3]]
b=np.arange(4).reshape(2,2)#生成数组[[0,1][2,3]]
c=np.arange(4).reshape(2,2)#生成数组[[0,1][2,3]]
print(a.reshape(-1),'\n',a)#输出[0,1,2,3]和[[0,1],[2,3]]
print(b.ravel(),'\n',a)#输出[0,1,2,3]和[[0,1],[2,3]]
print(c.flatten(),'\n',a)#输出[0,1,2,3]和[[0,1],[2,3]]
将多维数组降为一维时可以选择a.flatten()方法,a.ravel()方法,它们都没有改变原有数组,而是返回一个修改后的新数组。a.reshape(-1)方法也可以用来做降维,将参数设为-1即可。
例2.12 数组组合效果示例
import numpy as np
a=np.arange(4).reshape(2,2)#生成数组[[0,1][2,3]]
b=np.arange(4,8).reshape(2,2)#生成数组[[4,5][6,7]]
c1=np.vstack([a,b])#垂直方向组合
c2=np.r_[a,b]#垂直方向组合
d1=np.hstack([a,b])#水平方向组合
d2=np.c_[a,b]#水平方向组合
print(c1)
print('---------------')
print(c2)
print('---------------')
print(d1)
print('---------------')
print(d2)
多个数组组合分为垂直方向组合和水平方向组合两种
垂直方向组合: c1=np.vstack([a,b])
c2=np.r_[a,b] 注意:vstack需要多一个小括号水平方向组合:d1=np.hstack([a,b])
d2=np.c_[a,b] 注意:hstack需要多一个小括号
例2.13 数组分割示例
import numpy as np
a=np.arange(4).reshape(2,2)#生成数组[[0,1][2,3]]
b=np.hsplit(a,2)#把a平均分成两个列数组
c=np.vsplit(a,2)#把a平均分成两个行数组
print(b)
print('---------------')
print(c)
print('---------------')
数组可以按行分割,也可以按列分割
按行分割:c=np.vsplit(a,2)
按列分割:b=np.hsplit(a,2)
两个函数都有两个参数,第一个参数是被分割的原数组,第二个参数是分割成的份数。
2.1.2 数组的运算,通用函数和广播运算
1.四则运算
numpy库中实现四则运算可以使用运算符号+,-,*,/,也可以使用函数add(),substract(),multiply(),divide()。需要注意的是,函数只能接受两个对象的运算,如果有多个对象,可以选择运算符号或者嵌套运算。
除了加减乘除,还有三个数学运算符,分别是:余数,整除和幂次,可以使用符号:%,//,**,也可以使用函数fmod(),modf()和power()。需要注意的是,整除的函数略有复杂,需要写作np.modf(a/b)[1],因为modf()函数可以返回数值的小数部分或者整数部分。
注意,以上7种数学运算都是对每一个对应元素分别计算。
例2.14 数组的简单运算示例
import numpy as np
a=np.arange(10,15)#生成数组[10,11,12,13,14]
b=np.arange(5,10)#生成数组[5,6,7,8,9]
c=a+b;d=a*b#对应元素分别相加或者相乘
e1=np.modf(a/b)[0]#对应元素相除的小数部分,返回值为浮点数
e2=np.modf(a/b)[1]#对应元素相除的整数部分,返回值为浮点数
print(a)
print('---------------')
print(b)
print('---------------')
print(e1)
print('---------------')
print(e2)
print('---------------')
2.比较运算
注意:比较运算符返回值为True或False。
比较运算符结合布尔索引可以取出特定元素。
例2.15 比较运算符示例
import numpy as np
a=np.array([[3,4,9],[12,15,1]])
b=np.array([[2,6,3],[7,8,12]])
print(a[a>b])#输出a中大于b的所有元素
print(a[a>10])#输出a中大于10的所有元素
print(np.where(a>10,-1,a