0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

机器学习三剑客之Numpy怎么学

电子工程师 来源:ct 2019-05-31 16:57 次阅读

一、前言

玩数据分析、数据挖掘、AI的都知道这个python库用的是很多的,里面包含各种操作,在实际的dataset的处理当中是非常常用的,这里我做一个总结,方便自己看,也方便大家看,我准备做一个非常细致的分类,每个分类有对应的numpy常用用法,以后见到或者用到再一个个慢慢加进来,如果我还用csdn我就会移植update下去。

二、下载、安装、导入

用anaconda安装是十分方便的,如果你已经安装了tf,keras之类的,其实已经直接把numpy安装了,一般来说安装就是pip命令。

1pipinstallnumpy#py22pip3installnumpy#py3

用法则是

1importnumpyasnp#一般as为np来操作

三、常用用法总结

1.array基本信息以及生成各种常见array基本操作

生成array,得到对应的基本信息

1importnumpyasnp 2 3array=np.array([[1,2,3], 4[2,3,4]]) 5 6printarray#numpy生成的array 7printarray.dtype#每个元素的类型 8print"numberofdim",array.ndim#array的维度 9print'shape:',array.shape#形状,两行三列。10print'size:',array.size#array的大小=array中所有元素的个数11"""12[[123]13[234]]14int6415numberofdim216shape:(2,3)17size:618"""

array的生成就是np.array(list),本质上是把定义的list转换成array,因为array可以进行更加方便地计算和操作,比如矩阵的转置和相乘。

array的dtype设置

1importnumpyasnp 2 3a=np.array([2,23,4],dtype=np.float32) 4print"a'sdtype",a.dtype 5aa=np.array([2,23,4],dtype=np.int) 6print"aa'sdtype",aa.dtype 7aaa=np.array([2,23,4]) 8print"aaa'sdtype",aaa.dtype 9aaaa=np.array([2.2,23.2,4.2])10print"aaaa'sdtype",aaaa.dtype11aaaaa=np.array([2,23,4],dtype=np.int64)12print"aaaaa'sdtype:",aaaaa.dtype1314"""15a'sdtypefloat3216aa'sdtypeint6417aaa'sdtypeint6418aaaa'sdtypefloat6419aaaaa'sdtype:int6420"""

由可以得到一个结论就是如果定义的array里面的list的元素本身为整数的话,不设置type,则默认为int64,如果设置为int类型而没有设置字节大小则还是默认为int64,如果元素本身为小数,则默认为float64。所以如果用int64,则如果元素都为整数则不需要设置默认即可,设置其他类型需要设置,float类似。

生成常见array格式

1a1=np.zeros((2,3),dtype=np.int)#生成shape=(2,3)的全为0的array 2 3printa1 4""" 5[[000] 6[000]] 7""" 8 9a2=np.ones((3,4),dtype=np.int16)#生成shape=(3,4)的全为1的array1011printa212"""13[[1111]14[1111]15[1111]]16"""

这里注意shape=(a,b),在填入shape的参数的时候一定要加括号,以下雷同。

1a3=np.empty((3,4))#生成shape=(3,4)的全为接近空的array 2printa3 3""" 4[[6.92259773e-3104.67497449e-3106.92259751e-3106.92259750e-310] 5[2.37151510e-3223.16202013e-3220.00000000e+0006.92257087e-310] 6[6.92259748e-3106.92257087e-3106.92257063e-3106.92257063e-310]] 7""" 8a4=np.arange(10,20,2)#生成array10到20每隔2的一增加,for循环中主要使用 9printa410"""11[1012141618]12"""1314a5=np.arange(12)#生成array0到12-1=11每一个增加,for循环中非常常用15printa516"""17[01234567891011]18"""1920a6=np.arange(12).reshape((3,4))#这里主要展示reshape的功能,能够重新定义矩阵的形状21printa622"""23[[0123]24[4567]25[891011]]26"""27 # 1和10之间4个元素越过,这个主要应用在插值运算或者matplotlib画光滑曲线的时候计算用到。28a7=np.linspace(1,10,4).reshape((2,2))2930printa731"""32[[1.4.]33[7.10.]]3435"""

2.array之间的计算

加减法

相同维度:

1importnumpyasnp 2 3a=np.array([10,20,30,40]) 4b=np.arange(4) 5print"a:",a 6print"b:",b 7c=a+b 8print"c:",c 9c1=a-b10print"c1:",c111"""12a:[10203040]13b:[0123]14c:[10213243]15c1:[10192837]16"""

不同维度:

1aa=np.array([[1,2,3,4], 2[11,22,33,44]]) 3 4bb=np.arange(4) 5 6print"aa:",aa 7print"bb:",bb 8print"a+b:",aa+bb 910"""11aa:[[1234]12[11223344]]13bb:[0123]14a+b:[[1357]15[11233547]]16"""

如果是不同维度的array进行加减法的话,程序就是把维度低的array自动复制扩展到大维度的array,进行相加当然前提条件是两个不同维度的array进行相加的时候,低维度的array的shape也要和高维度的array其中一个shape相同,例如上面代码所示,(2,4) (1,4) 都有个shape为4

乘除法

1d=np.array([[1,2], 2[3,4]]) 3e=np.arange(1,8,2).reshape((2,2)) 4print"d:",d 5print"e:",e 6 7print"d*e:",d*e#对应元素相乘 8print"d/e",d/e#对应元素相除,因为是int64类型所以类似于2/3=0 9"""10d:[[12]11[34]]12e:[[13]13[57]]14d*e:[[16]15[1528]]16d/e[[10]17[00]]18"""

不同纬度的乘除法和上面加减法解析情况一样,可对比来看。

平方,三角函数,比较元素大小

1a=np.array([10,20,30,40]) 2b=np.arange(4) 3c2=b**2#平方 4print"c2:",c2 5 6c3=10*np.sin(a)#sin函数 7print"c3:",c3 8""" 9c2:[0149]10c3:[-5.440211119.12945251-9.880316247.4511316]11"""12print"b:",b13print"b:",b< 3 # b中小于3的都为TRUE14print "b:", b == 3 # b中等于3的为TRUE15"""16b: [0 1 2 3]17b: [ True  True  True False]18b: [False False False  True]1920"""

矩阵相乘

1d=np.array([[1,2], 2[3,4]]) 3e=np.arange(1,8,2).reshape((2,2)) 4print"d:",d 5print"e:",e 6printnp.dot(d,e) 7printd.dot(e) 8""" 9d:[[12]10[34]]11e:[[13]12[57]]13[[1117]#例如11为1*1+2*5=1114[2337]]15[[1117]16[2337]]1718"""

np.dot(d, e) 与d.dot(e)一样,都为d和e进行矩阵相乘

随机数和max,min,sum

1f=np.random.random((2,4))#随机产生shape为(2,4)的一个array,每个元素都为0-1之间随机生成 2printf 3print"=------=" 4printnp.sum(f) 5printnp.min(f) 6printnp.max(f) 7""" 8[[0.110275230.848419910.598669920.92557867] 9[0.999175220.27715650.255781980.06671013]]10=------=114.081767552987877120.06671012832269874130.999175215388682714"""15print"============="16printnp.sum(f,axis=0)17printnp.min(f,axis=1)18printnp.max(f,axis=0)19"""20[1.109450441.125576410.85445190.9922888]21[0.110275230.06671013]22[0.999175220.848419910.598669920.92557867]23"""

顾名思义,sum为总,min为最小,max为最大,如果不设置axis维度参数的话,则都为整个array的元素来说,但一般我们运用都只是算某个维度的sum,max,min,在二维数据中,axis=0代表行,第一个维度,axis=1,代表列为第二个维度,其实这么记并不是很好很有可能记错,我一般都是这么记得:axis=0为行,那意思就是每一行都要算呗?算完那不就是一列的每一行算个数被,axis=1类推,多维数据类推即可

矩阵转置和排序,以及元素比较大小重置元素方法

1c=np.arange(14,2,-1).reshape((3,4)) 2 3printc 4print"sort:",np.sort(c)#每一行进行重新大小排序当然也有axis参数配置,根据我的axis参数说明来操作 5 6printnp.transpose(c)#转置同下面操作 7printc.T#转置同上面操作 8 9print"clip:",np.clip(c,5,9)#c矩阵中的元素小于5的等于5,大于9的等于910"""11[[14131211]12[10987]13[6543]]14sort:[[11121314]15[78910]16[3456]]17[[14106]18[1395]19[1284]20[1173]]21[[14106]22[1395]23[1284]24[1173]]25clip:[[9999]26[9987]27[6555]]28"""

平均值、中值,累加,后减前

1a=np.arange(2,14).reshape((3,4)) 2print"a:",a 3print"average:",np.average(a)#平均值 4print"median:",np.median(a)#中值 5 6print"cumsum:",np.cumsum(a)#每个元素变成当前元素+前面所有元素的和 7print"diff:",np.diff(a)#当前元素减去前面元素的差 8""" 9a:[[2345]10[6789]11[10111213]]12average:7.513median:7.514cumsum:[259142027354454657790]15diff:[[111]16[111]17[111]]18"""

3.索引

最大值最小值索引,非零索引

1a=np.array([[2,6,0,4], 2[4,8,9,1], 3[10,2,3,11]]) 4print"argmin:",np.argmin(a) 5print"axis0:",np.argmin(a,axis=0) 6print"axis1:",np.argmin(a,axis=1) 7print"argmax:",np.argmax(a) 8print"zero:",np.nonzero(a) 910"""11argmin:212axis0:[0201]13axis1:[231]14argmax:1115zero:(array([0,0,0,1,1,1,1,2,2,2,2]),array([0,1,3,0,1,2,3,0,1,2,3]))16"""

argmin/argmax都是返回最小值/最大值的索引的函数。这里的axis和上面的分析是完全一致的,例如argmin(a)就是最小的索引,虽小的毋庸置疑是0,所以总体来讲从第一行第一个元素到最后一行最后一个元素,总体来算索引,那就是第二个为0,所以返回2,如果axis=0说明一列中的每一行来比较,那第一列比较出来最小的为2,即索引为0,因为每一列的每一行来比较所以最后的维度为列数,在这里即为4,以此列推。非零索引的意思为非零的数返回索引,如上例为返回两个array,前面array对应行索引,后面对应列索引,一前一后加一起的shape才对应一个非零索引

取值,取列或行

1importnumpyasnp 2 3a=np.arange(3,15).reshape((3,4)) 4 5printa 6printa[1]#索引为1的行,同下 7printa[:][1]#索引为1的行,同上 8print"=========-------===========" 9printa[2][1]#和数组一样的表示10printa[2,1]#同上,这才是比较标准的array的索引表示,前面是行后面是列的索引11print"=========---------============"12printa[:,1]#索引为1的列,生成为行向量13printa[:,1:2]#索引为1的列,生成为列向量14printa[:,1:3]1516printa[1,1:3]#为上面a[:,1:3]的索引为1的行向量17"""18[[3456]19[78910]20[11121314]]21[78910]22[78910]23=========-------===========2412251226=========---------============27[4812]28[[4]29[8]30[12]]31[[45]32[89]33[1213]]34[89]35"""

着重讲一下a[:, 1:2]a[:, 1:3]a[1, 1:3]

a[:, 1:2]::代表行所有也就是一列要的话,这一列的每一行都要,1:2对应的从索引为1的列来算移植相当于取到索引为(2-1)的列,2为取的最高索引大一个。所以总体来讲就是首先取每一行,之后在行里取索引1->1的列元素,所以为最终的结果列向量。

a[:, 1:3]:按照上面的分析则每一行都要,列要索引为1和(3-1)的元素,那就是索引为1和2的所有元素,也就是第二列和第三列的元素。

a[1, 1:3]:为a[:, 1:3]的索引为1的所有元素。这里需要注意的是

a[:, 1]#索引为1的列,生成为行向量,

a[:, 1:2]#索引为1的列,生成为列向量

因为两种取值的思想不一样,最终造成的结果也不一样,一个是直接取,所以维度减少了一个,另一个是在原本维度上截取,最终还是原来的维度。

迭代元素和降维

1a=np.arange(3,15).reshape((3,4))# 数据都是下取上差一个取到。 2printa 3print"row" 4forrowina:#取每一行迭代 5printrow 6print"column" 7forcolumnina.T:#每一列迭代 8printcolumn 9print"====================="10printa.flatten()#所有元素变成一维11b=np.array([[1,2,3]])12printb13printb.flatten()#降维1415foritemina.flat:#每个元素打印16printitem1718"""19[[3456]20[78910]21[11121314]]22row23[3456]24[78910]25[11121314]26column27[3711]28[4812]29[5913]30[61014]31=====================32[34567891011121314]33[[123]]34[123]3533643753863974084194210431144124513461447"""

行迭代,就是可以理解为最外层的维度进行迭代,列迭代就是利用转置来完成。flatten()函数的意思为把array的内层的维度进行降一维,将内层的维度弄掉,则二维数据就成为一维数据了


4.合并与分开

两个合并、多个合并(行向量转换成列向量)

1#-*-coding:utf-8-*- 2importnumpyasnp 3 4a=np.array([1,1,2]) 5b=np.array([2,3,4]) 6 7c=np.vstack((a,b))#vertical 8 9print"a:",a10print"b:",b11print"c:",c12print"a,cshape:",a.shape,c.shape1314d=np.hstack((a,b))#horizontal15print"d:",d16printd.shape17"""18a:[112]19b:[234]20c:[[112]21[234]]22a,cshape:(3,)(2,3)23d:[112234]24(6,)25"""26printa.T#nottransponse行向量无法直接用转置来变成列向量27#行向量变成列向量28printa[np.newaxis,:].shape29printa[:,np.newaxis].shape30printa[:,np.newaxis]#转换方法31"""32[112]33(1,3)34(3,1)35[[1]36[1]37[2]]38"""39a=np.array([1,1,2])[:,np.newaxis]40b=np.array([2,3,4])[:,np.newaxis]4142c=np.concatenate((a,b,b),axis=0)#多向量融合4344printc4546c=np.concatenate((a,b,b),axis=1)#多向量融合4748printc4950"""51[[1]52[1]53[2]54[2]55[3]56[4]57[2]58[3]59[4]]60[[122]61[133]62[244]]63"""

分开

1#-*-coding:utf-8-*- 2importnumpyasnp 3 4a=np.arange(12).reshape((3,4)) 5 6printa 7print"平等分开" 8print"vertical:",np.split(a,2,axis=1)# 910print"horizontal:",np.split(a,3,axis=0)#11"""12[[0123]13[4567]14[891011]]15平等分开16vertical:[array([[0,1],17[4,5],18[8,9]]),array([[2,3],19[6,7],20[10,11]])]21horizontal:[array([[0,1,2,3]]),array([[4,5,6,7]]),array([[8,9,10,11]])]22"""23print"不平等分开"24printnp.array_split(a,3,axis=1)2526print"代替需要axis参数"27print"vertical_a:",np.vsplit(a,3)2829print"horizontal_a:",np.hsplit(a,2)30"""31不平等分开32[array([[0,1],33[4,5],34[8,9]]),array([[2],35[6],36[10]]),array([[3],37[7],38[11]])]39代替需要axis参数40vertical_a:[array([[0,1,2,3]]),array([[4,5,6,7]]),array([[8,9,10,11]])]41horizontal_a:[array([[0,1],42[4,5],43[8,9]]),array([[2,3],44[6,7],45[10,11]])]46"""

5.元素传递和copy

1b=np.arange(4) 2 3printb 4c=b 5e=c 6d=e 7b[0]=11 8printb 910printcisb11printdisb12printb[0]1314d[1:3]=[22,22]15printb16printc1718c=b.copy()1920b[3]=442122printb23printc24printe25"""26[0123]27[11123]28True29True301131[1122223]32[1122223]33[11222244]34[1122223]35[11222244]36"""

array这个元素传递有点意思的,就是如果直接a=b,其实从内存角度来考虑就相当于a和b指向了一样的元素内存空间,所以改变一个元素的值,另一个一样改变,如果想各是各的,并且还想传递另一个元素的值那就用a=b.copy(),所以这个还是需要注意的

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器
    +关注

    关注

    0

    文章

    756

    浏览量

    40491

原文标题:【Data Mining】机器学习三剑客之Numpy常用用法总结

文章出处:【微信号:TheBigData1024,微信公众号:人工智能与大数据技术】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    地平线:集齐“三剑客”,让人人都能会造机器

    7月25日,在“地平线2023机器人开发者创享日”活动现场,四足机械狗、张牙舞爪的机械臂、“跑起来的高达”等机器人产品遍地跑,让人着实大开眼界。如何实现?那就是集齐地平线召唤机器人的“三剑客
    的头像 发表于 07-31 15:27 1851次阅读
    地平线:集齐“<b class='flag-5'>三剑客</b>”,让人人都能会造<b class='flag-5'>机器</b>人

    【西师大三剑客】基于物联网的笔记本电子防盗锁网络

    ` 本帖最后由 wangjiamin2014 于 2015-1-9 17:17 编辑 项目名称: 基于物联网的笔记本电子防盗锁网络团队名称:西师大三剑客团队成员:李波|徐春|刘名杨作品图片作品
    发表于 12-31 10:27

    【积分兑换】+镊子三剑客

    `` 本帖最后由 wamcncn 于 2016-5-28 09:24 编辑 最近积分商城上架好多新的奖品,看着羞涩的积分,貌似只能兑换镊子件套。用磁铁检测仪下,手柄可以吸起来,前端吸不起来。``
    发表于 05-27 18:35

    小米也玩智慧城市?三剑客联手“不务正业”

    (小米物联网)和AI集成服务等。小结看阵势,本次三剑客联手布局智慧城市可不是“不务正业”:小米提供硬件和用户、易华录提供数据存储技术、金山云加以城市云计算服务,三剑客联手将有望给智慧城市带来一场全新的变革
    发表于 11-15 11:42

    shell文本的处理方法是什么

    shell文本处理三剑客—grep
    发表于 05-27 12:32

    Numpy学习总结

    Numpy学习笔记
    发表于 07-16 08:27

    C语言三剑客《C陷阱与缺陷》一书精华提炼 精选资料分享

    点击上方“大鱼机器人”,选择“置顶/星标公众号”福利干货,第一时间送达!1、C陷阱与缺陷概述C语言像一把雕刻刀,锋利,并且在技师手中非常有用。和任何锋利的工具一样,C会伤到那些不能掌握它...
    发表于 07-22 09:37

    嵌入式Linux系统知识架构

    嵌入式Linux系统知识架构及层次嵌入式Linux系统构成及启动略析嵌入式Linux三剑客uboot技术嵌入式Linux三剑客之内核技术嵌入式Linux三剑客
    发表于 10-27 07:22

    机器学习的基础内容介绍

    学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任
    发表于 01-12 08:12

    3ds max7渲染传奇三剑客-VRay教程

    3ds max7渲染传奇三剑客-VRay教程
    发表于 09-07 17:14 0次下载
    3ds max7渲染传奇<b class='flag-5'>三剑客</b>-VRay教程

    锂离子正极三剑客之一:钴酸锂

    锂离子正极三剑客之一:钴酸锂 1,LiCoO2的一种合成方法    &nbs
    发表于 11-04 14:09 1258次阅读

    锂离子正极三剑客之一:锰酸锂

    锂离子正极三剑客之一:锰酸锂 颗粒大小和形貌、粒度分布、比表面积、振实密度以及电极加工性能、
    发表于 11-04 14:33 1182次阅读

    数学建模三剑客Numpy

    numpy的数组对象除了一些常规的属性外,也有几个类似转置、扁平迭代器等看起来更像是方法的属性。扁平迭代器也许是遍历多维数组的一个简明方法,下面的代码给出了一个例子。
    的头像 发表于 10-11 10:44 3477次阅读
    数学建模<b class='flag-5'>三剑客</b>之<b class='flag-5'>Numpy</b>

    Python不为人知的机器学习软件包

    动态数据科学的这三剑客几乎无人不知无人不晓:Numpy,Pandas和Matplotlib。你可能已经熟悉这些包以及它们的运作方式。还有其他很炫酷的包,你肯定也想试一试,例如Plotly
    的头像 发表于 07-05 10:22 1853次阅读

    Redmi Note 9 Pro系列三剑客正式亮相

    11月26日晚,Redmi召开Note 9系列新品发布会,带来了Note 9三剑客,分别是Note 9 4G版、Note 9、Note 9 Pro。
    的头像 发表于 11-27 09:56 1462次阅读