一、前言
玩数据分析、数据挖掘、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 #每个元素的类型 8printnumberofdim,array.ndim #array的维度 9print'shape:',array.shape #形状, 两行三列。10print'size:',array.size#array的大小=array中所有元素的个数1112[[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) 4printa'sdtype,a.dtype 5aa=np.array([2,23,4],dtype=np.int) 6printaa'sdtype,aa.dtype 7aaa=np.array([2,23,4]) 8printaaa'sdtype,aaa.dtype 9aaaa=np.array([2.2,23.2,4.2])10printaaaa'sdtype,aaaa.dtype11aaaaa=np.array([2,23,4],dtype=np.int64)12printaaaaa'sdtype:,aaaaa.dtype131415a'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的array1011printa21213[[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)#生成array 10到20 每隔2的一增加,for循环中主要使用 9printa41011[1012141618]121314a5=np.arange(12)#生成array 0到12-1=11 每一个增加,for循环中非常常用15printa51617[01234567891011]181920a6=np.arange(12).reshape((3,4))#这里主要展示reshape的功能,能够重新定义矩阵的形状21printa62223[[0123]24[4567]25[891011]]2627 # 1和10之间4个元素越过,这个主要应用在插值运算或者matplotlib画光滑曲线的时候计算用到。28a7=np.linspace(1,10,4).reshape((2,2)) 2930printa73132[[1.4.]33[7.10.]]3435
2.array之间的计算
加减法
相同维度:
1importnumpyasnp 2 3a=np.array([10,20,30,40]) 4b=np.arange(4) 5printa:,a 6printb:,b 7c=a+b 8printc:,c 9c1=a-b10printc1:,c11112a:[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 6printaa:,aa 7printbb:,bb 8printa+b:,aa+bb 91011aa:[[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)) 4printd:,d 5printe:,e 6 7printd*e:,d*e#对应元素相乘 8printd/e,d/e#对应元素相除,因为是int64类型所以类似于2/3=0 910d:[[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#平方 4printc2:,c2 5 6c3=10*np.sin(a)# sin函数 7printc3:,c3 8 9c2:[0149]10c3:[-5.440211119.12945251-9.880316247.4511316]1112printb:,b13printb:,b1的列元素,所以为最终的结果列向量。
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 3printrow 4forrowina: #取每一行迭代 5printrow 6printcolumn 7forcolumnina.t: #每一列迭代 8printcolumn 9print=====================10printa.flatten()#所有元素变成一维11b=np.array([[1,2,3]]) 12printb13printb.flatten()#降维1415foritemina.flat: #每个元素打印16printitem171819[[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 9printa:,a10printb:,b11printc:,c12printa,cshape:,a.shape,c.shape1314d=np.hstack((a,b))#horizontal15printd:,d16printd.shape1718a:[112]19b:[234]20c:[[112]21[234]]22a,cshape:(3,)(2,3)23d:[112234]24(6,)2526printa.t#nottransponse 行向量无法直接用转置来变成列向量27#行向量变成列向量28printa[np.newaxis,:].shape29printa[:,np.newaxis].shape30printa[:,np.newaxis]#转换方法3132[112]33(1,3)34(3,1)35[[1]36[1]37[2]]3839a=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)#多向量融合4748printc495051[[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平等分开 8printvertical:,np.split(a,2,axis=1)# 910printhorizontal:,np.split(a,3,axis=0)#1112[[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]])]2223print不平等分开24printnp.array_split(a,3,axis=1)2526print代替需要axis参数27printvertical_a:,np.vsplit(a,3)2829printhorizontal_a:,np.hsplit(a,2)3031不平等分开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]=442122printb23printc24printe2526[0123]27[11123]28true29true301131[1122223]32[1122223]33[11222244]34[1122223]35[11222244]36
array这个元素传递有点意思的,就是如果直接a=b,其实从内存角度来考虑就相当于a和b指向了一样的元素内存空间,所以改变一个元素的值,另一个一样改变,如果想各是各的,并且还想传递另一个元素的值那就用a=b.copy(),所以这个还是需要注意的
HDB3编解码简析
OPPOR15x和OPPOK1哪个好
革命性创新工艺:利用太阳能生产水泥
亚马逊推出一款新的增强现实应用
华为P11什么时候上市?华为P11提前曝光来救场,麒麟970+8G运存+望式双摄暴强配置
机器学习三剑客之Numpy怎么学
华为云数字资产链,构建新型数字经济价值
联想移动再次换帅,ZUK品牌已被放弃?
2021年避免勒索软件攻击的预防方法
普源RIGOL 数字示波器DS1102Z-E 技术参数
硝基化合物电化学还原衍生的偶氮化合物用于高性能锂电池
声控玩具小猫的电路
虹科方案 | 您的通用软件无线电外设升级了吗?虹科提供最新高频5G毫米波解决方案
无线数传电台模块E3A-DTU-500介绍
富士通NEC表示2014年将推出Tizen OS设备
oppor11什么时候上市?oppor11最新消息:oppor11发布盛典再曝亮点,满满的都是惊喜,你不期待?
催化燃烧式传感器的工作原理
军哥哥,这是真的么?红米手机还有一个小弟?
Arrays的copyOf,copyOfRange和fill方法
IBM惠普将推双内核芯片服务器