1.numpy
1.1numpy简介
NumPy是Python中的一个运算速度非常快的一个数学库,它非常重视数组。它允许你在Python中进行向量和矩阵计算,并且由于许多底层函数实际上是用C编写的,因此你可以体验在原生Python中永远无法体验到的速度。简单来说numpy可以完成数组从建立,修改,检索,运算等一系列操作
1.2Numpy库方法
- 此处都为 import numpy as np
生成数组 array
array用法:数组和列表有所不同,我们需要将列表转换为数组才能使用数组相关的函数,创造数组时,根据元素类型,会自适应选择int,float还是其他类型
格式:
方法1:np.array(list1,dtype='')
list1为列表元素,只能写一个列表,如果为2个列表,需要在外面加上[],进行下述步骤都需要这一步,dtype表示初始数组类型
查行列数 shape
用法:shape可以查看数组的行列数,有一种特殊的(n,)为可行可列元素
格式:
方法1:np.shape(a)
a为数组,一位会显示(n,),除非生数组时在list一层列表外再套一层[],在生成的就是(1,n)
方法2:a.shape
全生成零 zeros
用法:> 直接生成一个数组,且元素全为0数组,生成的为float64元素,可通过dtype关键字来修改输出类型(eg:dtype=’int32’)
格式:
方法1:np.zeros(n) 生成n*1的(n,)元素全为0数组
方法2:np.zeros((n,m))生成(n,m)的全为0数组
全生成一 ones
用法:直接生成一个数组,且元素全为1数组,生成的为float64元素
格式:
方法1:np.ones(n) 生成n*1的(n,)元素全为1数组
方法2:np.ones((n,m,dtype=''))生成(n,m)的全为1数组
全填充数 fill
用法:我们发现有数组元素全为0或者数组元素全为1,那后面的我们也想2,3,4…显然是不科学的,因此使用fill来满足,不同于上述ones,zeros,此处fill需要先创建一个数组才能对其修改,如果希望修改dtype,可以使用astype对原数组a进行修改
格式:
方法1:a.fill(value: int | float | complex)
a为数组,value填写数字,表示将a数组的数据修改为value值,注意的是fill默认的输出类型是随a改变的,a为int型,即使输入float也会变为int
类型强转 astype
用法:将数组类型转变为设定的类型,不是对原数组进行修改的_______后续我们会发现,对于元素本身修改的函数并不多
格式:
方法1:b=a.astype('数据类型')
a为数组,将其复制一份返回转变为数据类型给b
整数序列 arange
用法:生成整数的序列,可以设置步长step
格式:
方法1:np.arange(n,m,step=k)
左闭右开,生成从n到m-1的序列,步长为k
元素类型 dtype
用法:获取数组的元素类型
格式:
方法1:a.dtype
获取a数组中元素的类型
等差数列 linspace
用法: 不同在于其是左闭右闭,为[],生成一串间隔相同的等差数列
格式:
方法1:np.linspace(n,m,k)
从n到m分为k-1份,之后取节点,节点的取值方法是从n开始取的,m结束,因此n,m一定会被取到,这里k的含义应该是k个等差数列的数
生随机数 rand
用法:生成随机0-1的整数,返回数组格式
格式:
方法1:np.random.rand(n)
生成含有n个数的0-1一维数组
方法2:np.random.rand(n,m)
生成n*m数组的0-1的二维数组
整数随机 randint
用法:生成指定范围的整数数组,左闭右开
格式:
方法1:np.random.randint(n,m,i)
生成i个n到m-1之间的随机整数作为一维数组
方法2:np.random.randint(n,m,(i,j))
生成(i,j)个n到m-1之间的随机整数作为二维数组
元素个数 size
用法: 查看数组中的元素个数
格式:
方法1:np.size(a)
获取a中的元素,a即使为列表/元组也可以获取
方法2:a.size
只有当a为数组时,才可以使用此方法,用于获取数组中的元素个数
查看维数 ndim
用法:查看数组的维数
格式:
方法1:np.ndim(a)
方法2:a.ndim
一维索切 a[m]
用法: a为一个数组m个元素,索引数组中的一个或者多个元素,复制a中的元素,而不是获取他的地址位置,切片是复制其元素地址位置
格式:
方法1:a[i]
一维数组只能索引一个获取a中的i位置的元素,从0开始计数,支持负索引,复制
方法2:a[i:j]
此时相当于对于a进行切片,从i到j-1(左闭右开0)从0开始,支持负切片,切片不是复制,而是获取地址,因此改变数据,原数组也会改变
方法3:np.where(a>m)
a为数组,返回a中数组元素大于m的位置,从0开始计位置.
二维索切 a[m,n]
用法:a为二维数组,m行n列,索引数组中的一个或者多个元素,复制a中的元素,而不是获取他的地址位置,切片是复制其元素地址位置
格式:
方法1:a[(i1,j1),(i2,j2),...]
索引a中多个对应行列数据元素
方法2:a[i] a[i,] a[:,j]
第一个第二个默认切片i行,第三个默认索引j列 :不能省去
方法3:a[i1:i2,j1:j2]
表示切片i1到i2行,j1到j2列的元素,i1,i2,j1,j2省略,表示从开始计算,或者到达结尾
方法4:a[b]
b为bool型数组(0为False,其他为True),b为一维数组是,表示切片为True的行,b同为二维时表示索引a中单个为True位置的元素,并返回一维数组
方法5:a[(i1,i2,i3,i4,...),(jn,j2,j3,j4,...)]
花式索引,表示同时索引(i1,jn)(i2,j2)(i3,j3)(i4,j4)(ix,jy)的元素*奇怪
方法5:np.where(a>2)
返回a二维数组中的元素位置,表示方式特殊下实例,第一行为行,第二行为列,一一对应,返回的为元组,用处极大,当对应属性有其他属性时,就很方便
a=np.array([[1,2,3,4],[2,3,4,5],[3,4,5,6],[4,4,4,4]])
np.where(a>3)
>>>(array([0, 1, 1, 2, 2, 2, 3, 3, 3, 3], dtype=int64),#行位置[一一对应,eg(0,3),(1,2)多是大于3的元素]
>>> array([3, 2, 3, 1, 2, 3, 0, 1, 2, 3], dtype=int64))#列位置
伪转类型 asarray
用法:将数组或者列表元素复制一份并可以对其类型进行转换,返回为数组类型,算是array的进阶版,因为可以转数组
格式:
方法1:np.asarray(a,dtype='')
将a数组或者列表复制一份,返回转换为dtype类型的数组,不修改原数组
数组排序 sort
用法:将a数组进行排序,不论是二维数组还是一维数组,都只对其行内进行排序,而非整体
格式:
方法1:np.sort(a)
排序索引 argsort
用法:sort排序的大小按照大小顺序返回对应元素在原数组中的位置,原数组从0开始
格式:
方法1:np.argsort(a)
只对一维数组生效,即使是二维也只对每一行进行排序
案例:
a=np.array([[3,2,8,4]])
order=np.argsort(a)
>>>1,0,3,2,对应大小
a[order[0]]
>>>获取最小的元素2
数组求和 sum
用法:求数组中元素的总和
格式:
方法1:a.sum()
方法2:np.sum(a)
求最大值 max
用法:求数组中元素的最大值
格式:
方法1:a.max()
方法2:np.max(a)
求最小值 min
用法:求数组中元素的最小值
格式:
方法1:a.min()
方法2:np.min(a)
求均值 mean
用法:求数组中元素的平均值
格式:
方法1:a.mean()
方法2:np.mean(a)
求标准差 std
用法:求数组中元素的标准差
格式:
方法1:a.std()
方法2:np.std(a)
相关系数 cov
用法:求数组a,b的相关系数
格式:
方法1:np.cov(a,b)
变行列数 shape
用法:一个数组我们希望其中元素根据我们希望的行列数进行排列,就使用shape,之前是查询用法,这里是修改,对原数组修改**
格式:
方法1:a.shape=(n,m) a.shape=n,m
a需要为n*m个数组元素,转变为n行m列的数组,可以无括号,修改时发现a为2维时,修改,元组的方式顺序是一行一行的元素转变
案例:
a=np.array([[1,2,3,4,5,6]])
a.shape=2,3
a
>>>
1,2,3
4,5,6
a.shape=3,2
a
>>>
1,2,3
4,5,6
数组转置 transpose
用法:将数组进行转置,但都不会替换a
格式:
方法1:a.T
方法2:a.transpose() np.transpose(a)
数组连接 concatente
用法:将不同数组连接起来,但需要行拓展(列拼接)时需要列相同,列拓展(行拼接)时需要行相同
格式:
方法1:np.concatenate((a0,a1),axis=)
a0,a1为向量,axis表示拼接方向,默认为0表示行拓展(列拼接),需要保证列数相同;1表示列拓展(行拼接),需要保证行数相同
数组拼接 ~task
用法:numpy有三个函数可以直接实现拼接
格式:
方法1:np.vstack((a0,a1))#列拼接
方法2:np.hstack((a0,a1))#行拼接
方法3:np.dstack((a0,a1))#维度拼接
案例:
a0=np.array([[1,2,3,4],[2,3,4,5]])
a1=np.array([[1,2,3,4],[2,3,4,5]])
np.vstack((a0,a1))#列拼接
>>>
1,2,3,4
2,3,4,5
1,2,3,4
2,3,4,5
np.hstack((a0,a1))#行拼接
>>>
1,2,3,4,1,2,3,4
2,3,4,5,2,3,4,5
np.dstack((a0,a1))#加维度拼接
>>>
array([[[1, 1],
[2, 2],
[3, 3],
[4, 4]],
[[2, 2],
[3, 3],
[4, 4],
[5, 5]]])
求绝对值 abs
用法:将数组中的每个元素变为绝对值后的元素
格式:
方法1:np.abs(a)
方法2:a.__abs__()#绝对值
a为数组
求解指数 exp
用法:将数组中的每个元素k变为e为底数的k次幂(e (k))
格式:
方法1:np.exp(a)
求解中值 median
用法:求解数组元素的中值
格式:
方法1:np.median(a)
求累加和 cumsum
用法:新生成的数组a1[n]=a[0]+a[1]+…+a[n]或者表示为a1[n]=a1[n-1]+a[n],a1[0]=a[0],生成的新数组不会覆盖原数组
格式:
方法1:np.cumsum(a)
#1.3数组类型
基本类型 可用的Numpy类型 备注
布尔型 bool 占一个字节
整型 int8,int16,int32,int64,int128,int int和C语言中long一样长
无符号整型 uint8,uint16,uint32,uint64,uint128,uint uint和C语言中unsigned long一样长
浮点数 float16,float32,float64,float128,float 默认双精度float64,longfloat精度大小与系统有关
复数 complex64,complex128,complex,longcomplex 默认为complex128,即实部虚部都为双精度
字符串 string,unicode 可以使用dtype=S4表示一个四字节字符串的数组
对象 object 数组中可以使用任意值
时间 datetime,timedelta64
1.4注意事项
- 一般通过array生成的一维数组格式为(n,)格式,则说明此数组可以当行向量使用,也可以当列向量使用,如果能相乘得到的也是(n,)向量
- 除了a.shape(n,m)会使得a的数组发生变化,其他数组基本上都是复制一份a进行修改,a不发生变化,(a为一个含有n*m个元素的数组)
- 列表与数组的运算有极大地不同,列表之间相加相当于append,无法相减;数组相加减就是对应行列元素相加减,数组相乘使用@
- np.方法(数组) 与 数组.方法的区别在于前者不一定要是数组也可以执行并得到正确的结果,后者在于需要声明自己是数组类型,才可以使用数组类中的方法和类属性
个人笔记,可能存在错误,希望各位批评指正!!!