Numpy是一个用python实现的科学计算的扩展程序库,包括:1、一个强大的N维数组对象Array;2、比较成熟的(广播)函数库;3、用于整合C/C++和Fortran代码的工具包;4、实用的线性代数、傅里叶变换和随机数生成函数。numpy和稀疏矩阵运算包scipy配合使用更加方便。
NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。多为很多大型金融公司使用,以及核心的科学计算组织如:Lawrence Livermore,NASA用其处理一些本来使用C++,Fortran或Matlab等所做的任务。
好久没来长文了,今天来一篇年终代码长文,那么看完这一篇你将学到numpy的基本常用操作,下面一起来看吧,欢迎转发支持,谢谢!!!(本文作者:光城)
本文目录
1.Numpy基本操作1.1 列表转为矩阵1.2 维度1.3 行数和列数()1.4 元素个数2.Numpy创建array2.1 一维array创建2.1 多维array创建2.2 创建全零数组2.3 创建全一数据2.4 创建全空数组2.5 创建连续数组2.6 reshape操作2.7 创建连续型数据2.8 linspace的reshape操作3.Numpy基本运算3.1 一维矩阵运算3.2 多维矩阵运算3.3 基本计算4.Numpy索引与切片5.Numpy array合并5.1 数组合并5.2 数组转置为矩阵5.3 多个矩阵合并5.4 合并例子26.Numpy array分割6.1 构造3行4列矩阵6.2 等量分割6.3 不等量分割6.4 其他的分割方式7.Numpy copy与 =7.1 =赋值方式会带有关联性7.2 copy()赋值方式没有关联性8.广播机制9.常用函数
1.Numpy基本操作
1.1 列表转为矩阵
importnumpyasnparray=np.array([[1,3,5],[4,6,9]])print(array)
输出:
[[135][469]]
1.2 维度
print('numberofdim:',array.ndim)
输出:
numberofdim:2
1.3 行数和列数()
print('shape:',array.shape)
输出:
shape:(2,3)
1.4 元素个数
print('size:',array.size)
输出:
size:6
2.Numpy创建array
2.1 一维array创建
importnumpyasnp#一维arraya=np.array([2,23,4],dtype=np.int32)#np.int默认为int32print(a)print(a.dtype)
输出:
[2234]int32
2.1 多维array创建
#多维arraya=np.array([[2,3,4],[3,4,5]])print(a)#生成2行3列的矩阵
输出:
[[234][345]]
2.2 创建全零数组
a=np.zeros((3,4))print(a)#生成3行4列的全零矩阵
输出:
[[0.0.0.0.][0.0.0.0.][0.0.0.0.]]
2.3 创建全一数据
#创建全一数据,同时指定数据类型a=np.ones((3,4),dtype=np.int)print(a)
输出:
[[1111][1111][1111]]
2.4 创建全空数组
#创建全空数组,其实每个值都是接近于零的数a=np.empty((3,4))print(a)
输出:
[[0.0.0.0.][0.0.0.0.][0.0.0.0.]]
2.5 创建连续数组
#创建连续数组a=np.arange(10,21,2)#10-20的数据,步长为2print(a)
输出:
[101214161820]
2.6 reshape操作
#使用reshape改变上述数据的形状b=a.reshape((2,3))print(b)
输出:
[[101214][161820]]
2.7 创建连续型数据
#创建线段型数据a=np.linspace(1,10,20)#开始端1,结束端10,且分割成20个数据,生成线段print(a)
输出:
[1.1.473684211.947368422.421052632.894736843.368421053.842105264.315789474.789473685.263157895.736842116.210526326.684210537.157894747.631578958.105263168.578947379.052631589.5263157910.]
2.8 linspace的reshape操作
#同时也可以reshapeb=a.reshape((5,4))print(b)
输出:
[[1.1.473684211.947368422.42105263][2.894736843.368421053.842105264.31578947][4.789473685.263157895.736842116.21052632][6.684210537.157894747.631578958.10526316][8.578947379.052631589.5263157910.]]
3.Numpy基本运算
3.1 一维矩阵运算
importnumpyasnp#一维矩阵运算a=np.array([10,20,30,40])b=np.arange(4)print(a,b)#[10203040][0123]c=a-bprint(c)#[10192837]print(a*b)#若用a.dot(b),则为各维之和#[02060120]#在Numpy中,想要求出矩阵中各个元素的乘方需要依赖双星符号**,以二次方举例,即:c=b**2print(c)#[0149]#Numpy中具有很多的数学函数工具c=np.sin(a)print(c)#[-0.544021110.91294525-0.988031620.74511316]print(b<2)#[TrueTrueFalseFalse]a=np.array([1,1,4,3])b=np.arange(4)print(a==b)#[FalseTrueFalseTrue]
3.2 多维矩阵运算
a=np.array([[1,1],[0,1]])b=np.arange(4).reshape((2,2))print(a)'''[[11][01]]'''print(b)'''[[01][23]]'''#多维度矩阵乘法#第一种乘法方式:c=a.dot(b)print(c)#第二种乘法:c=np.dot(a,b)print(c)'''[[24][23]]'''#多维矩阵乘法不能直接使用'*'号a=np.random.random((2,4))print(np.sum(a))#3.657010765991042print(np.min(a))#0.10936760904735132print(np.max(a))#0.9476048882750654print("a=",a)'''a=[[0.166074360.947604890.596491170.22698245][0.664944640.234479840.109367610.71106581]]'''print("sum=",np.sum(a,axis=1))#sum=[1.937152871.7198579]print("min=",np.min(a,axis=0))#min=[0.166074360.234479840.109367610.22698245]print("max=",np.max(a,axis=1))#max=[0.947604890.71106581]'''如果你需要对行或者列进行查找运算,就需要在上述代码中为axis进行赋值。当axis的值为0的时候,将会以列作为查找单元,当axis的值为1的时候,将会以行作为查找单元。'''
3.3 基本计算
importnumpyasnpA=np.arange(2,14).reshape((3,4))print(A)#最小元素索引print(np.argmin(A))#0#最大元素索引print(np.argmax(A))#11#求整个矩阵的均值print(np.mean(A))#7.5print(np.average(A))#7.5print(A.mean())#7.5#中位数print(np.median(A))#7.5#累加print(np.cumsum(A))#[259142027354454657790]#累差运算B=np.array([[3,5,9],[4,8,10]])print(np.diff(B))'''[[24][42]]'''C=np.array([[0,5,9],[4,0,10]])print(np.nonzero(B))print(np.nonzero(C))'''#将所有非零元素的行与列坐标分割开,重构成两个分别关于行和列的矩阵(array([0,0,0,1,1,1],dtype=int64),array([0,1,2,0,1,2],dtype=int64))(array([0,0,1,1],dtype=int64),array([1,2,0,2],dtype=int64))'''#仿照列表排序A=np.arange(14,2,-1).reshape((3,4))#-1表示反向递减一个步长print(A)'''[[14131211][10987][6543]]'''print(np.sort(A))'''#只是对每行进行递增排序[[11121314][78910][3456]]'''#矩阵转置print(np.transpose(A))'''[[14106][1395][1284][1173]]'''print(A.T)'''[[14106][1395][1284][1173]]'''print(A)print(np.clip(A,5,9))'''clip(Array,Array_min,Array_max)将Array_min<X<Array_maxX表示矩阵A中的数,如果满足上述关系,则原数不变。否则,如果X<Array_min,则将矩阵中X变为Array_min;如果X>Array_max,则将矩阵中X变为Array_max.[[9999][9987][6555]]'''
4.Numpy索引与切片
importnumpyasnpA=np.arange(3,15)print(A)#[34567891011121314]print(A[3])#6B=A.reshape(3,4)print(B)'''[[3456][78910][11121314]]'''print(B[2])#[11121314]print(B[0][2])#5print(B[0,2])#5#list切片操作print(B[1,1:3])#[89]1:3表示1-2不包含3forrowinB:print(row)'''[3456][78910][11121314]'''#如果要打印列,则进行转置即可forcolumninB.T:print(column)'''[3711][4812][5913][61014]'''#多维转一维A=np.arange(3,15).reshape((3,4))#print(A)print(A.flatten())#flat是一个迭代器,本身是一个object属性foriteminA.flat:print(item)
我们一起来来总结一下,看下面切片取值方式(对应颜色是取出来的结果):
5.Numpy array合并
5.1 数组合并
importnumpyasnpA=np.array([1,1,1])B=np.array([2,2,2])print(np.vstack((A,B)))#verticalstack上下合并,对括号的两个整体操作。'''[[111][222]]'''C=np.vstack((A,B))print(C)print(A.shape,B.shape,C.shape)#(3,)(3,)(2,3)#从shape中看出A,B均为拥有3项的数组(数列)#horizontalstack左右合并D=np.hstack((A,B))print(D)#[111222]print(A.shape,B.shape,D.shape)#(3,)(3,)(6,)#对于A,B这种,为数组或数列,无法进行转置,需要借助其他函数进行转置
5.2 数组转置为矩阵
print(A[np.newaxis,:])#[111]变为[[111]]print(A[np.newaxis,:].shape)#(3,)变为(1,3)print(A[:,np.newaxis])'''[[1][1][1]]'''
5.3 多个矩阵合并
#concatenate的第一个例子print("------------")print(A[:,np.newaxis].shape)#(3,1)A=A[:,np.newaxis]#数组转为矩阵B=B[:,np.newaxis]#数组转为矩阵#axis=0纵向合并C=np.concatenate((A,B,B,A),axis=0)print(C)'''[[1][1][1][2][2][2][2][2][2][1][1][1]]'''#axis=1横向合并C=np.concatenate((A,B),axis=1)print(C)'''[[12][12][12]]'''
5.4 合并例子2
#concatenate的第二个例子print("-------------")a=np.arange(8).reshape(2,4)b=np.arange(8).reshape(2,4)print(a)print(b)print("-------------")#axis=0多个矩阵纵向合并c=np.concatenate((a,b),axis=0)print(c)#axis=1多个矩阵横向合并c=np.concatenate((a,b),axis=1)print(c)'''[[0123][4567][0123][4567]][[01230123][45674567]]'''
6.Numpy array分割
6.1 构造3行4列矩阵
importnumpyasnpA=np.arange(12).reshape((3,4))print(A)'''[[0123][4567][891011]]'''
6.2 等量分割
#等量分割#纵向分割同横向合并的axisprint(np.split(A,2,axis=1))'''[array([[0,1],[4,5],[8,9]]),array([[2,3],[6,7],[10,11]])]'''#横向分割同纵向合并的axisprint(np.split(A,3,axis=0))#[array([[0,1,2,3]]),array([[4,5,6,7]]),array([[8,9,10,11]])]
6.3 不等量分割
print(np.array_split(A,3,axis=1))'''[array([[0,1],[4,5],[8,9]]),array([[2],[6],[10]]),array([[3],[7],[11]])]'''
6.4 其他的分割方式
#横向分割print(np.vsplit(A,3))#等价于print(np.split(A,3,axis=0))#[array([[0,1,2,3]]),array([[4,5,6,7]]),array([[8,9,10,11]])]#纵向分割print(np.hsplit(A,2))#等价于print(np.split(A,2,axis=1))'''[array([[0,1],[4,5],[8,9]]),array([[2,3],[6,7],[10,11]])]'''
7.Numpy copy与 =
7.1 =赋值方式会带有关联性
importnumpyasnp#`=`赋值方式会带有关联性a=np.arange(4)print(a)#[0123]b=ac=ad=ba[0]=11print(a)#[11123]print(b)#[11123]print(c)#[11123]print(d)#[11123]print(bisa)#Trueprint(cisa)#Trueprint(disa)#Trued[1:3]=[22,33]print(a)#[1122333]print(b)#[1122333]print(c)#[1122333]
7.2 copy()赋值方式没有关联性
a=np.arange(4)print(a)#[0123]b=a.copy()#deepcopyprint(b)#[0123]a[3]=44print(a)#[01244]print(b)#[0123]#此时a与b已经没有关联
8.广播机制
numpy数组间的基础运算是一对一,也就是a.shape==b.shape,但是当两者不一样的时候,就会自动触发广播机制,如下例子:
fromnumpyimportarraya=array([[0,0,0],[10,10,10],[20,20,20],[30,30,30]])b=array([0,1,2])print(a+b)
输出:
[[012][101112][22][303132]]
为什么是这个样子?
这里以tile
模拟上述操作,来回到a.shape==b.shape情况!
#对[0,1,2]行重复3次,列重复1次b=np.tile([0,1,2],(4,1))print(a+b)
输出:
[[012][101112][22][303132]]
到这里,我们来给出一张图:
也可以看这张图:
是不是任何情况都可以呢?
当然不是,只有当两个数组的trailing dimensions compatible时才会触发广播,否则报错ValueError: frames are not aligned exception
。
上面表达意思是尾部维度必须兼容!
尾部维度:
将多维数组右对齐!能够上下对应,这部分就是尾部,而对应的头部维度,则是维度大的数组比维度小的数组多出来的维度!如下面实际例子:
axis:012a(3darray):256x256x3b(2darray):256x3a+b(2darray):256x256x3
兼容
they are equal, or one of them is 1
兼容两层意思,深入研究,第一:they are equal
尾部维度相等!
axis:012a(3darray):256x256x3b(2darray):256x3a+b(2darray):256x256x3
第二:one of them is 1
像下面这个尾部维度不等,但是a或者b对应的元素有1存在,那么也满足兼容性!
axis:012a(3darray):256x256x1b(2darray):1x3a+b(2darray):256x256x3
也就是1可以和任意维度兼容!
广播失败:
axis:012a1(3darray):256x256x1b(2darray):220x3a1+bValueError
失败转化
axis:0123a2(4darray):256x256x1x1b(2darray):220x3a2+b(4darray):256x256x220x3
我们看到在a2的第三个维度增加了一个1,扩充为4维,便可以正常广播!
如何实现a1到a2转化?
a2 = a1[:,:,np.newaxis,:]
即可!
9.常用函数
9.1 np.bincount()
首先生成一个一维数组
x=np.array([1,2,3,3,0,1,4])
统计索引出现次数:索引0出现1次,1出现2次,2出现1次,3出现2次,4出现1次
因此通过bincount计算出索引出现次数如下:
np.bincount(x)#[12121]
上面怎么得到的?
对于bincount计算吗,bin的数量比x中最大数多1,例如x最大为4,那么bin数量为5(index从0到4),也就会bincount输出的一维数组为5个数,bincount中的数又代表什么?代表的是它的索引值在x中出现的次数!
还是以上述x为例子,当我们设置weights参数时候,结果又是什么?
这里假定:
w=np.array([0.3,0.5,0.7,0.6,0.1,-0.9,1])
那么设置这个w权重后,结果为多少?
np.bincount(x,weights=w)
输出:
[0.1-0.60.51.31.]
怎么计算的?
先对x与w抽取出来:
x--->[1,2,3,3,0,1,4]w--->[0.3,0.5,0.7,0.6,0.1,-0.9,1]
索引 0 出现在x中index=4位置,那么在w中访问index=4的位置即可,w[4]=0.1
索引 1 出现在x中index=0与index=5位置,那么在w中访问index=0与index=5的位置即可,然后将两这个加和,计算得:w[0]+w[5]=-0.6
其余的按照上面的方法即可!
bincount的另外一个参数为minlength,这个参数简单,可以这么理解,当所给的bin数量多于实际从x中得到的bin数量后,后面没有访问到的设置为0即可。
还是上述x为例:
这里我们直接设置minlength=7参数,并输出!
[1212100]
与上面相比多了两个0,这两个怎么会多?
上面知道,这个bin数量为5,index从0到4,那么当minlength为7的时候,也就是总长为7,index从0到6,多了后面两位,直接补位为0即可!
9.2 np.argmax()
函数原型为:numpy.argmax(a, axis=None, out=None)
.
函数表示返回沿轴axis最大值的索引。
x=[[1,3,3],[7,5,2]]print(np.argmax(x))#3
对于这个例子我们知道,7最大,索引位置为3(这个索引按照递增顺序)!
axis属性
axis=0表示按列操作,也就是对比当前列,找出最大值的索引!
x=[[1,3,3],[7,5,2]]print(np.argmax(x,axis=0))#[110]
axis=1表示按行操作,也就是对比当前行,找出最大值的索引!
x=[[1,3,3],[7,5,2]]print(np.argmax(x,axis=0))#[10]
那如果碰到重复最大元素?
返回第一个最大值索引即可!
例如:
x=np.array([1,3,2,3,0,1,0])print(x.argmax())#1
9.3 上述合并实例
这里来融合上述两个函数,举个例子:
x=np.array([1,2,3,3,0,1,4])print(np.argmax(np.bincount(x)))
最终结果为1,为什么?
首先通过np.bincount(x)得到的结果是:[1 2 1 2 1],再根据最后的遇到重复最大值项,则返回第一个最大值的index即可!2的index为1,所以返回1。
9.4 求取精度
取指定位置的精度
In
np.around([-0.6,1.2798,2.357,9.67,13],decimals=0)
Out
看到没,负数进位取绝对值大的!
array([-1.,1.,2.,10.,13.])
In
np.around([1.2798,2.357,9.67,13],decimals=1)
Out
array([1.3,2.4,9.7,13.])
In
np.around([1.2798,2.357,9.67,13],decimals=2)
Out
array([1.28,2.36,9.67,13.])
从上面可以看出,decimals表示指定保留有效数的位数,当超过5就会进位(此时包含5)!
但是,如果这个参数设置为负数,又表示什么?
In
np.around([1,2,5,6,56],decimals=-1)
Out
array([0,0,0,10,60])
发现没,当超过5时候(不包含5),才会进位!-1表示看一位数进位即可,那么如果改为-2呢,那就得看两位!
例如:
In
np.around([1,2,5,50,56,190],decimals=-2)
Out
array([0,0,0,0,100,200])
看到没,必须看两位,超过50才会进位,190的话,就看后面两位,后两位90超过50,进位,那么为200!
计算沿指定轴第N维的离散差值
In
x=np.arange(1,16).reshape((3,5))
Out
array([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]])
In
np.diff(x,axis=1)#默认axis=1
Out
array([[1,1,1,1],[1,1,1,1],[1,1,1,1]])
In
np.diff(x,axis=0)
Out
array([[5,5,5,5,5],[5,5,5,5,5]])
取整
In
np.floor([-0.6,-1.4,-0.1,-1.8,0,1.4,1.7])
Out
array([-1.,-2.,-1.,-2.,0.,1.,1.])
看到没,负数取整,跟上述的around一样,是向左!
取上限
np.ceil([1.2,1.5,1.8,2.1,2.0,-0.5,-0.6,-0.3])
取上限!找这个小数的最大整数即可!
查找
利用np.where
实现小于0的值用0填充吗,大于0的数不变!
In
x=np.array([[1,0],[2,-2],[-2,1]])
Out
array([[1,0],[2,-2],[-2,1]])
In
np.where(x>0,x,0)
Out
array([[1,0],[2,0],[0,1]])
作者光城的公众号:
请关注和分享↓↓↓
机器学习初学者
QQ群:774999266
往期精彩回顾
良心推荐:机器学习入门资料汇总及学习建议(版)
黄海广博士的github镜像下载(机器学习及深度学习资源)
吴恩达老师的机器学习和深度学习课程笔记打印版
机器学习小抄-(像背托福单词一样理解机器学习)
首发:深度学习入门宝典-《python深度学习》原文代码中文注释版及电子书
科研工作者的神器-zotero论文管理工具
机器学习的数学基础
机器学习必备宝典-《统计学习方法》的python代码实现、电子书及课件
吐血推荐收藏的学位论文排版教程(完整版)
如果觉得《适合初学者快速入门的Numpy实战全集》对你有帮助,请点赞、收藏,并留下你的观点哦!