Python机器学习及分析工具:Numpy篇

  人工智能(Artificial Intelligence,AI)时代,简单易学,同时拥有着丰富模块库的Python成为时代的宠儿,活跃在人工智能的各个领域。我们可以借助Python库执行基本的机器学习任务。常用的Python科学库如下:

  • 矩阵函数操作库(Numpy)
  • 科学计算包(Scipy)
  • Python绘图库(Matplotlib)
  • 数据分析包(Pandas)
  • 机器学习函数库(Scikit-learn)
  • 统计建模工具包(StatsModels)
  • 深度学习框架(TensorFlow)

Numpy

Numpy即Numeric Python,是用来存储和处理大型多维矩阵的开源数值计算开源工具,由于机器学习算法在处理数据过程中大多涉及线性代数,需要用到矩阵的各种操作,故而,Numpy在机器学习领域有着较多的使用场景。


  Python语言提供数据类型列表(list)和array模块都可以当作数组使用。然而在处理数据过程中,我们一般不建议使用这两种方式,因为list的元素可以是任意对象,因此list中保存的是对象的指针,这样为了保存一个简单的[a,b],需要有2个指针和2个字符对象。对于大规模的数值运算来说,这种结构显然会对内存和CPU的性能造成极大的浪费。而array模块提供的array对象和列表不同,虽然可以直接保存数据,但由于它不支持多维,也没有各种运算函数,因此也不适合做数值运算。
  Numpy的出现弥补了这些不足,Numpy提供两种基本对象:
  ndarray(N-dimensional array object):存储单一数据类型的多维数组;
  ufunc(universal function object):对数组进行处理的函数;


  • 模块导入
import numpy as np

  • 数组的创建方式
    1.将Python列表转换为数组

    np.array((1,2,3,4,5))
    

    2.将Python的range对象转换成数组

    np.array(range(5))
    

    3.创建一维数组

    np.array([1,2,3,4,5])
    

    4.创建二维数组

    np.array([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]])  # 3行5列
    

    5.生成等差数组

    np.linspace(1,5,5)     
    

    linspace(start,end,size):生成以start为首项,end为末项,项数为size的等差数组

    6.生成等比数组

    np.logspace(0,100,10)
    

    logspace(start,end,size):生成首项为0,末项为100,项数为size的等比数组

    7.创建全0二维数组

    np.zeros((3,3))
    

    8.创建全0一维数组

    np.zeros((3,1))
    

    7.创建全1二维数组

    np.ones((3,3))
    

    8.创建全1一维数组

    np.ones((3,1))
    

    8.创建全0二维数组

    np.zeros((3,3))
    

    9.创建单位矩阵

    np.identity(3)
    

    10.创建空数组

    np.empty((3,3))
    

    只申请空间而不初始化,元素值是不确定的
    11.使用arrange函数创建函数,类似于Python的range函数
    f = np.arrange(0,1,0.1)


  • 获取数组的属性值
    a.通过shape获取数组的大小

    arr = np.array([[1,2],[3,4]])
    arr.shape
    

    可以通过修改数组的shape属性,在保持数组元素个数不变的情况下,改变数组每个轴的长度,需要注意的是,只是改变了轴的大小,数组元素在内存中的位置并没有改变。

    当某个轴的值为-1时,将根据数组元素自动计算此轴的长度,如数组a是一个(3,4)的数组,若令a.shape=(2,-1),输出a.shape后发现轴的值改为(2,6)。

    b.使用数组的reshape方法,可以创建一个改变了尺寸的新数组,但是原数组的shape保持不变。

    a = np.array([1,2,3,4])
    b = a.reshape((2,2))
    

    显示结果如下:

    array([[1,2],[3,4]])
    

    使用reshape方法生成的新数组与原数组共享内存区域,因此修改其中任何一个数组元素的会同时修改另一个数组的内容。
    c.数组的类型
    通过数组的dtype属性获得数组的元素类型

    a = np.array([1,2,3,4])
    a.dtype
    

    显示结果如下

    dtype('int32')
    

    可以通过dtype参数在创建数组时指定元素类型

    e = np.array([1,2,3,4],dtype = np.float)
    

    d.

  • 数组运算

    • 数组与数值的算术运算
        数组与数值的算术运算实质是数组中的元素与数值进行运算。
    • 数组与数组的算术运算
        数组与数组的算术运算实质也是数组元素之间进行运算
    a = np.array([1,2,3])
    b = np.array([[1,2,3],[4,5,6],[7,8,9]])
    c = a*b
    

    显示结果如下

    array([[1,4,9],[4,10,18],[7,16,27]])
    
    • Numpy使用arr.T实现二维数组转置,arr.dot()实现向量内积的计算,支持切片操作

  • Numpy常用函数
ufunc manual
round(_) 对元素进行四舍五入操作
floor(x) 对数组x所有元素向下取整
ceil(x) 对数组x所有元素向上取整
sum(x,axis=arg) 不给出axis参数时,表示对数组所有元素求和;axis=0时,对数组纵向求和;axis=1时进行横向求和。
mean(x,axis=arg) 返回数组元素算术平均值,axis参数的用法类似sum()
max/min(x,axis=arg) 返回元素的最大/最小值,axis参数的用法同上
std(x,axis=arg) 返回元素的标准差,axis参数的用法同上
var(x,axis=arg) 返回元素的方差,axis参数的用法同上
sort(x,axis=arg) 返回排序后的数组,axis参数的用法同上
where(condition,x,y) 当只给出条件,未给出参数x,y时,则输出满足条件元素的坐标,坐标以tuple形式给出;当条件参数都给出时,满足条件,输出x,反之输出y。
piecewise(x,condlist,funclist) 分段函数,参数x是一个保存自变量值的数组.condlist是一个长度为M的布尔数组列表,其中的每个布尔数组的长度都和数组x相同。funclist是一个长度为M或M+1的函数列表。

分段函数示例:

x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# 数组x的元素中,小于4的乘3,大于6的乘2,其余都为0
np.piecewise(x, [x<4,x>6], [lambda x:x*3,lambda x:2*x])
随机数生成函数 特征
rand() 生成0~1之间的随机数
randn() 生成服从标准正态分布的随机数
uniform(x,y,num) 随机生成num个实数,它在 [x, y) 范围内
randint(low, high,( shape)) 依shape创建随机整数或整数数组,范围是[ low, high) seed(s) :随机数种子
shuffle(a) 根据数组a的第一轴进行随机排列,改变数组a
permutation(a) 根据数组a的第一轴进行随机排列, 但是不改变原数组,将生成新数组
choice(a[, size, replace, p]) 从一维数组a中以概率p抽取元素, 形成size形状新数组,replace表示是否可以重用元素,默认为False。

更多函数请参考Numpy函数库



  • 广播(Broadcasting)
      我们讨论了许多数组之间的运算,但是显然,都是基于数组纬度一致的前提。当我们需要对两个纬度不同的数组进行运算时,就需要了解numpy中的广播机制。其实质就是将不同维度的数组转换维相同纬度在进行运算,在实际应用中许多基于网格或者基于网络的问题都需要使用广播。


    Broadcasting

  关于广播机制的详细讨论可以参考文章:
  广播(Broadcasting)
  Numpy二元运算的Broadcasting机制

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