失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 适合初学者快速入门的Numpy实战全集

适合初学者快速入门的Numpy实战全集

时间:2022-10-29 15:05:40

相关推荐

适合初学者快速入门的Numpy实战全集

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实战全集》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。