Python-03 ~ 机器学习库 之 NumPy

NumPy是机器学习中最常用的计算科学库,今天就来看看吧

NumPy简单介绍

  • NumPy的简单介绍:
    1. NumPy是机器学习中一个数据分析的核心基础库;
    2. NumPy中最核心的数据类型就是NumPy数组(类似于MatLab中的矩阵),要求这个数组中的数据的数据类型必须保持一致;
    3. 底层使用C、C++,Forturn语言实现,所以运算的效率是非常高的;
  • NumPy的主要内容:
    1. NumPy数组的初始化;
    2. 花式索引,即高阶数组索引;
    3. 随机数组的生成

NumPy数组的使用:

  1. NumPy数组的初始化:同一个NumPy数组中数据的数据类型最好保持一致:

    • 1维数组:
      import numpy as np
      arr1 = np.array([1, 2, 3, 4, 5]) # type(arr1)=numpy.ndarray(n dimension array)
      arr2 = np.array((1, 2, 3, 4, 5))
      
      • 即使使用元组的方式创建一个数组,那么最终会自动转化成列表的形式
    • 2维数组:
      import numpy as np
      arr1 = np.array(<list>) 
      arr2 = np.array(<list>)
      
    • 初始化的时候给定数据类型
      arr = np.array(<list>, dtype=int) 
      
      • 其中dtype可以是:bool,int,float,str,np.float32,np.float64,np.int32,np.int64···
      • 生成一个新的数组返回
    • 使用已经存在的NumPy数组初始化一个新的NumPy数组
      arr = np.asarray(<nd-array>[, dtype=<data-type>]) 
      
      • 如果<nd-array>和dtype都是一样的,就不会生成一个新的NumPy数组
    • 使用astype生成新的NumPy数组
      arr = <nd-array>.astype(<type>) 
      
    • 生成全0/1的NumPy数组
      arr = <nd-array>.zeros/ones(<shape>) 
      
      • 这里的<shape>本质上就是一个n维元组,而且这个元组的括号必须带上
    • 按照区间与步长结合生成NumPy数组
      arr = np.arange([<start>, ]<end>[, <step>]) 
      
      • 需要知道的是这个arange方法支持浮点数的生成
      • arange生成也是前闭后开的
    • 按照区间与生成个数结合生成NumPy数组
      arr = np.linespace([<start>, ]<end>[, <shape>]) 
      
      • linespace生成也是前闭后也是闭的
      • <shape>默认是50
    • 随机生成数组
      arr = np.random.rand(<shape>) # 均匀分布
      arr = np.random.randn(<shape>) # 高斯分布
      
  2. NumPy数组的运算:

    • 给ndarray的每个元素加一个数字a
      arr = <nd-array> + a
      
      • 列表是不支持这个列表+数字操作的;
    • 两个维度一样的ndarray相加:
      arr = <nd-array1> + <nd-array2>
      
      • 列表支持列表+列表的操作,其结果就是把两个列表的一级元素重新组合成一个新的列表;而两个维度一样的ndarray相加的结果就是这两个数组对应位置的数字相加形成新的数组,维度与其父母保持一致;
    • 给ndarray的每个元素乘以一个数字a:
      arr = <nd-array> * a
      
      • 列表是支持这个列表*数字操作,其结果就是a个列表相加的结果,而NumPy数组与一个数字相乘的结果是这个NumPy数组的每个元素乘以这个数字得到的结果;
    • 两个维度一样的ndarray相乘:
      arr = <nd-array1> + <nd-array2>
      
      • 列表不支持支持列表*列表的操作;而两个维度一样的ndarray相乘的结果就是这两个数组对应位置的数字相乘形成新的数组,维度与其父母保持一致;
  3. NumPy数组的常用属性、方法:

    • 获取NumPy数组的行列数:
      <nd-array>.shape
      np.shape(<list>/<scalar>)
      
    • 获取NumPy数组的维数:
      <nd-array>.ndim
      
      • 当参数为<scalar>的时候,返回的结果是一个空元组;
    • 获取NumPy数组中数据的数据类型:
      <nd-array>.dtype
      
    • 获取NumPy数组中每个元素个数 ???高维???:
      <nd-array>.size
      np.size(<list>)
      
    • 获取NumPy数组中每个元素所占字节数:
      <nd-array>.itemsize
      
    • 获取NumPy数组所占字节数:
      <nd-array>.nbytes
      
    • 替换NumPy中的元素为一个新值:
      <nd-array>.fill(<new-value>)
      
    • 如果NumPy数组中的元素为一个虚数,获取其实部和虚部:
      <nd-array>.imag
      <nd-array>.real
      
    • 特殊值:无穷大和不是一个数字:
      np.inf # 无穷大
      np.nan # 不是一个数字
      
    • 特殊值:无穷大和不是一个数字:
      np.inf # 无穷大
      np.nan # 不是一个数字
      
    • NumPy数组求和:
      1. 全部的和
        <nd-array>.sum()
        
      2. 所有列的和
        <nd-array>.sum(axis=0)
        
      3. 所有行的和
        <nd-array>.sum(axis=1)
        
    • NumPy数组求积:
      <nd-array>.prod([axis=<num>])
      
    • NumPy数组最小值:
      <nd-array>.min([axis=<num>])
      
    • NumPy数组求最大值:
      <nd-array>.max([axis=<num>])
      
    • NumPy数组求每行(1)/列(0)最大值的位置:
      <nd-array>.argmax([axis=<num>])
      
    • NumPy数组求每行(1)/列(0)最小值的位置:
      <nd-array>.argmax([axis=<num>])
      
    • NumPy数组求平均值:
      <nd-array>.mean([axis=<num>])
      
    • NumPy数组的转置:
      <nd-array>.T
      
  4. 索引和切片

    • 索引和切片的方式和列表用法一样,也有不一样的地方:
      1. 使用列表的方式访问多维数组
        <nd-array>[<dimension1>, <dimension2>, ...]
        
      2. 获取二维数组的第n列数据
        <nd-array>[:, n]
        
      3. 给已有的二维数组<nd-array>添加维度:
        <nd-array>[:, :, None]
        
      4. 花式索引(Fancy Indexing):一次性从nd-array中根据索引获取多个值
        // TODO
        
  5. NumPy数组的遍历:

    • 普通的遍历
      for ele in <nd-array>:
          <for-body>
      
    • n维NumPy数组全元素遍历:
      for idx, ele in np.ndenumerate<nd-array>:
          <for-body>
      
  6. 两个NumPy数组的拼接:

    • 使用concatenate行(axis=0)/(axis=0)列拼接:
      np.concatenate(<nd-array1>, <nd-array2>, [axis=<axis-value>])
      
      • 注意,两个数组进行拼接的时候需要注意:若进行拼接,则列数必须相等,列拼接行数则必须相等;
    • 使用vstack(行:垂直拼接)/hstack(列:水平拼接)拼接:
      np.vstack(<nd-array1>, <nd-array2>) # 类似SQL中的 union
      np.hstack(<nd-array1>, <nd-array2>) # 类似SQL中的join
      np.dstack(<nd-array1>, <nd-array2>) # 结果是一个三维的变化结果,后面有时间讲解
      
  7. NumPy数组的数学运算:

    • NumPy数组的普通运算:
      <nd-array1> +/-/*///**/% <num>
      
    • NumPy数组作为矩阵的乘法:
      <nd-array1>.dot(<num>/<nd-array2>)
      <nd-array1> @ (<num>/<nd-array2>) # 与.dot的结果一样,Python3以后支持
      
    • NumPy数组的一些数学函数:
      np.cos(<nd-array>)
      np.cos(<nd-array>)
      np.aqrt(<nd-array>)
      ...
      
      • 注意, math模块的函数是无法直接作用于NumPy数组的
  8. NumPy数组的逻辑运算:

    • NumPy数组的普通逻辑运算:
      <nd-array1> >/>=/</<= <num>
      
      • 注意,逻辑运算的结果是一个数组,不能直接结合if使用,但是可以通过一些函数如:if np.all/any/allclose(<nd-array-logic-expression>)这种方式使用;
  9. NumPy数组的广播机制:

    • 目前还不是很明白,研究明白之后补吧
      // TODO 
      
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,552评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,666评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,519评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,180评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,205评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,344评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,781评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,449评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,635评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,467评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,515评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,217评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,775评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,851评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,084评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,637评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,204评论 2 341

推荐阅读更多精彩内容