python和机器学习 第三章

目录

3-2  魔法命令

3-3  Numpy数据基础numpy.array基础

3-4 创建numpy数组和矩阵

3-5 numpy数组的基本操作

3-6 numpy数组的合并与分割

3-7 numpy中的矩阵运算


3-2  魔法命令

%run

In [10]: %run time.py
-----------执行开始----------
100%[**************************************************->]5.46s
-----------执行结束----------

 %timeit

#测量性能的命令
In [21]: %timeit L = [i**2 for i in range(1000)]
343 µs ± 9.82 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

  %time


In [24]: %time L = [i**2 for i in range(1000)]
Wall time: 995 µs

  %lsmagic

可以查看所有的魔法命令

3-3  Numpy数据基础numpy.array基础

python list的特点

In [34]: L = [i for i in range(10)]

In [35]: L
Out[35]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

In [36]: L[5]
Out[36]: 5

In [38]: L[5]=100

In [39]: L
Out[39]: [0, 1, 2, 3, 4, 100, 6, 7, 8, 9]

In [40]: L[5] = "Machine learning"

In [41]: L
Out[41]: [0, 1, 2, 3, 4, 'Machine learning', 6, 7, 8, 9]

限定只能存储一种数据类型的数组

#第一个参数表示定义的数据类型,i表示整形
In [44]: arr = array.array('i',[i for i in range(10)])

In [45]: arr
Out[45]: array('i', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

#不能赋值其他数据类型

numpy中的array

In [52]: nparr = numpy.array([i for i in range(10)])

In [53]: nparr
Out[53]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [54]: nparr[5]
Out[54]: 5

In [55]: nparr[5] = 100

In [56]: nparr
Out[56]: array([  0,   1,   2,   3,   4, 100,   6,   7,   8,   9])

#不可以赋值其他类型的数据
In [58]: nparr[5] = "machine"
Traceback (most recent call last):

  File "<ipython-input-58-538ed72de039>", line 1, in <module>
    nparr[5] = "machine"

ValueError: invalid literal for int() with base 10: 'machine'

#查看数组的数据类型
In [59]: nparr.dtype
Out[59]: dtype('int32')

#强制类型转换
In [61]: nparr[3] = 3.14

In [62]: nparr
Out[62]: array([  0,   1,   2,   3,   4, 100,   6,   7,   8,   9])

In [64]: nparr2 = numpy.array([1,2,3.0])

In [66]: nparr2.dtype

Out[66]: dtype('float64')

3-4 创建numpy数组和矩阵

#创建全0数组或矩阵
In [68]: numpy.zeros(10)
Out[68]: array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
In [69]: numpy.zeros(10).dtype
Out[69]: dtype('float64')
#控制生成的元素的数据类型
In [70]: numpy.zeros(10,dtype=int)
Out[70]: array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
#矩阵
In [72]: numpy.zeros((3,5))
Out[72]: 
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])
#参数:大小,类型
In [73]: numpy.zeros(shape=(3,5),dtype=int)
Out[73]: 
array([[0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0]])

#创建全1的数组或矩阵
#数组
In [77]: numpy.ones(10)
Out[77]: array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
#矩阵
In [78]: numpy.ones((3,5))
Out[78]: 
array([[1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.]])

#指定创建的数组或矩阵中填充的数字
#写出参数名时参数顺序可以改变
In [81]: numpy.full(shape=(3,5),fill_value=666)
Out[81]: 
array([[666, 666, 666, 666, 666],
       [666, 666, 666, 666, 666],
       [666, 666, 666, 666, 666]])

In [82]: numpy.full(shape=(3,5),fill_value=666.0)
Out[82]: 
array([[666., 666., 666., 666., 666.],
       [666., 666., 666., 666., 666.],
       [666., 666., 666., 666., 666.]])

arange

In [85]: [i for i in range(0,20,2)]
Out[85]: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
In [86]: numpy.arange(0,20,2)
Out[86]: array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18])

#numpy中的arange可以传入浮点数
In [88]: numpy.arange(0,1,0.2)
Out[88]: 
array([ 0. ,  0.2,  0.4,  0.6,  0.8])

#默认起始点0、间隔1
In [90]: numpy.arange(0,10)
Out[90]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [91]: numpy.arange(10)
Out[91]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

linspace

#在区间等长的截取10个点,包括0和20这两个点
#最后一个参数不是步长,而是要截取的点的个数
In [94]: numpy.linspace(0,20,10)
Out[94]: 
array([ 0.        ,  2.22222222,  4.44444444,  6.66666667,  8.88888889,
       11.11111111, 13.33333333, 15.55555556, 17.77777778, 20.        ])

random

#生成一个0~10之间的随机数
#区间前闭后开
In [100]: numpy.random.randint(0,10)
Out[100]: 5
#生成一个随机数组
In [101]: numpy.random.randint(0,10,10)
Out[101]: array([9, 3, 3, 2, 6, 4, 6, 1, 2, 6])
#生成一个随机矩阵
In [107]: numpy.random.randint(4,8,size=(3,5))
Out[107]: 
array([[4, 7, 5, 6, 5],
       [5, 7, 5, 7, 6],
       [6, 6, 5, 4, 5]])

#随机种子会让生成的随机数相同
In [110]: numpy.random.randint(4,8,size=(3,5))
Out[110]: 
array([[4, 6, 5, 6, 6],
       [6, 5, 6, 4, 5],
       [7, 6, 7, 4, 7]])
In [111]: numpy.random.seed(666)
In [112]: numpy.random.randint(4,8,size=(3,5))
Out[112]: 
array([[4, 6, 5, 6, 6],
       [6, 5, 6, 4, 5],
       [7, 6, 7, 4, 7]])

#生成0和1之间的随机数
#生成的是在0、1之间均匀分布的浮点数
In [114]: numpy.random.random()
Out[114]: 0.2811684913927954
In [116]: numpy.random.random(10)
Out[116]: 
array([0.46284169, 0.23340091, 0.76706421, 0.81995656, 0.39747625,
       0.31644109, 0.15551206, 0.73460987, 0.73159555, 0.8578588 ])
In [117]: numpy.random.random((3,5))
Out[117]: 
array([[0.76741234, 0.95323137, 0.29097383, 0.84778197, 0.3497619 ],
       [0.92389692, 0.29489453, 0.52438061, 0.94253896, 0.07473949],
       [0.27646251, 0.4675855 , 0.31581532, 0.39016259, 0.26832981]])

#生成正态分布的浮点数
#默认是生成均值为0方差为1;
In [120]: numpy.random.normal()
Out[120]: 0.7760516793129695
#生成均值为10方差为100
In [121]: numpy.random.normal(10,100)
Out[121]: 128.06359754812632

In [124]: numpy.random.normal(0,1,(3,5))
Out[124]: 
array([[ 0.06102404,  1.07856138, -0.79783572,  1.1701326 ,  0.1121217 ],
       [ 0.03185388, -0.19206285,  0.78611284, -1.69046314, -0.98873907],
       [ 0.31398563,  0.39638567,  0.57656584, -0.07019407,  0.91250436]])

3-5 numpy数组的基本操作

基本属性

#x.ndim查看数组维数
In [128]: x = numpy.arange(15).reshape(3,5)
In [129]: x
Out[129]: 
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
In [130]: x.ndim
Out[130]: 2

#x.shape每个维度的元素个数
In [131]: x.shape
Out[131]: (3, 5)

#x.size 元素个数
In [132]: x.size
Out[132]: 15

#x.reshape不会改变x
#x.reshape(10,-1)只要10行,不管列数
#x.reshape(-1,2)不管行数,每行两个元素
In [156]: x
Out[156]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [157]: x.reshape(2,5)
Out[157]: 
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
In [158]: x
Out[158]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

numpy.array的元素访问

#一维
array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
In [134]: x[5]
In [133]: x[:-1]
In [134]: x[0:5]    #访问到5但不包含5
#切片
In [140]: X[::2]
Out[140]: array([0, 2, 4, 6, 8])
In [141]: X[::-1]
Out[141]: array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])

#二维
In [133]: x[2,2]
#切片
In [142]: x[:2,:3]    #前两行前三列
Out[142]: 
array([[0, 1, 2],
       [5, 6, 7]])

In [143]: x[:2,::2]    #前两行,从头到尾间隔为2
Out[143]: 
array([[0, 2, 4],
       [5, 7, 9]])

In [147]: x[0,:].ndim    #取出了第一行
Out[147]: 1

#对矩阵取子矩阵,修改子矩阵中的元素,也会改变矩阵的元素
#subx = x[:2,:3]    #引用
In [153]: subx = x[:2,:3].copy()    #获得副本


3-6 numpy数组的合并与分割

numpy.concatenate([x,y])  #其中可以有多个元素

In [170]: A = numpy.array([[1,2,3],[4,5,6]])
#axis默认是0,沿着行的方向进行拼接
In [173]: numpy.concatenate([A,A],axis=)
Out[173]: 
array([[1, 2, 3],
       [4, 5, 6],
       [1, 2, 3],
       [4, 5, 6]])
#沿着列的方向进行拼接
In [174]: numpy.concatenate([A,A],axis=1)
Out[174]: 
array([[1, 2, 3, 1, 2, 3],
       [4, 5, 6, 4, 5, 6]])

numpy.vstack([A,z])    #拼接两个不同维度的元素,垂直方向拼接

In [177]: numpy.vstack([A,z])
Out[177]: 
array([[1, 2, 3],
       [4, 5, 6],
       [6, 6, 6]])
#拼接两次
In [29]: v
Out[29]: array([1, 2])
In [30]: numpy.vstack([v]*2)
Out[30]: 
array([[1, 2],
       [1, 2]])

numpy.hstack([A,B])    #水平方向拼接

In [178]: B = numpy.full((2,2),100)

In [179]: B
Out[179]: 
array([[100, 100],
       [100, 100]])

In [180]: numpy.hstack([A,B])
Out[180]: 
array([[  1,   2,   3, 100, 100],
       [  4,   5,   6, 100, 100]])

numpy.split()  #数据的分割

#向量
In [181]: x = numpy.arange(10)

In [182]: x
Out[182]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [183]: numpy.split(x,[3,7])
Out[183]: [array([0, 1, 2]), array([3, 4, 5, 6]), array([7, 8, 9])]

#矩阵
In [186]: A = numpy.arange(16).reshape((4,4))
In [187]: A
Out[187]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
In [188]: A1,A2 = numpy.split(A,[2])
In [189]: A1
Out[189]: 
array([[0, 1, 2, 3],
       [4, 5, 6, 7]])
In [190]: A2
Out[190]: 
array([[ 8,  9, 10, 11],
       [12, 13, 14, 15]])
#基于列进行分割(默认是0,基于行)
In [191]: numpy.split(A,[2],axis=1)
Out[191]: 
[array([[ 0,  1],
        [ 4,  5],
        [ 8,  9],
        [12, 13]]), array([[ 2,  3],
        [ 6,  7],
        [10, 11],
        [14, 15]])]

numpy.vsplit()  #基于行进行分割,相当于axis = 0

numpy.hsplit()  #基于列进行分割,相当于axis = 1

In [195]: X,y = numpy.hsplit(A,[-1])
#分割最后一列
In [197]: X
Out[197]: 
array([[ 0,  1,  2],
       [ 4,  5,  6],
       [ 8,  9, 10],
       [12, 13, 14]])
In [198]: y
Out[198]: 
array([[ 3],
       [ 7],
       [11],
       [15]])

3-7 numpy中的矩阵运算

numpy中两个矩阵之间的运算都是对应元素在做运算

A*B是A、B两个矩阵的对应元素相乘

标准的矩阵的乘法为:A.dot(B)

A.T 矩阵的转置

In [29]: v
Out[29]: array([1, 2])
#拼接到和A的维度一样后相加
In [31]: numpy.vstack([v]*A.shape[0])+A
Out[31]: 
array([[1, 3],
       [3, 5]])
#或指定v在每个方向上堆叠的次数
In [33]: numpy.tile(v,[2,1])+A
Out[33]: 
array([[1, 3],
       [3, 5]])

矩阵的逆

In [35]: A
Out[35]: 
array([[0, 1],
       [2, 3]])
#求逆
In [37]: invA=numpy.linalg.inv(A)
In [38]: A.dot(invA)
Out[38]: 
array([[1., 0.],
       [0., 1.]])

当矩阵不是方阵时,可以求伪逆矩阵

In [39]: X = numpy.arange(16).reshape((2,8))
In [40]: X
Out[40]: 
array([[ 0,  1,  2,  3,  4,  5,  6,  7],
       [ 8,  9, 10, 11, 12, 13, 14, 15]])

In [41]: invpX = numpy.linalg.pinv(X)
In [43]: invpX
Out[43]: 
array([[-1.35416667e-01,  5.20833333e-02],
       [-1.01190476e-01,  4.16666667e-02],
       [-6.69642857e-02,  3.12500000e-02],
       [-3.27380952e-02,  2.08333333e-02],
       [ 1.48809524e-03,  1.04166667e-02],
       [ 3.57142857e-02, -1.04083409e-17],
       [ 6.99404762e-02, -1.04166667e-02],
       [ 1.04166667e-01, -2.08333333e-02]])
#求得的单位矩阵是个方阵
In [46]: X.dot(invpX)
Out[46]: 
array([[ 1.00000000e+00, -2.49800181e-16],
       [ 0.00000000e+00,  1.00000000e+00]])

3-8 numpy中的聚合运算

L是个向量

#numpy中的方法比直接使用如sum()的方法效率高

numpy.sum(L) #求和

numpy.min(L)  #最小值

numpy.max(L)  #最大值

x是个矩阵

numpy.sum(x,axis = 0) #沿着行方向进行求和运算,即对每一列求和

numpy.sum(x,axis=1) #沿着列方向进行运算

numpy.prod(x) #所有元素的乘积

numpy.prod(x+1) #每个元素加一后的乘积

numpy.mean(x) #平均值

numpy.median(x) # 中位数

#百分位

numpy.percentile(L,q=50) = numpy.median(L) 

numpy.percentile(L,q=100) = numpy.max(L)

for percent in [0,25,50,75,100]:

      numpy.percentile(L, q = percent)

#方差

numpy.var(L)

#标准差

numpy.std(L)

3-9 numpy中的arg运算 索引

#最小、最大值的索引值

numpy.argmin(L)

numpy.argmax(L)

#排序和使用索引

numpy.random.shuffle(x)  #打乱顺序

numpy.sort(x)   #排序,没有改变x本身

x.sort() #x本身改变了

numpy.sort(x,axis=0) #沿着行的方向排序,每一列都是有序的

numpy.sort(x,axis=1) #沿着列的方向进行排序,每一行都是有序的

numpy.argsort(x) #返回元素的索引

In [86]: x
Out[86]: array([11,  8, 10,  0,  7, 15, 13,  4,  9,  6,  3, 14,  1, 12,  2,  5])
#元素从小到大的索引
In [87]: numpy.argsort(x)
Out[87]: 
array([ 3, 12, 14, 10,  7, 15,  9,  4,  1,  8,  2,  0, 13,  6, 11,  5],
      dtype=int64)

numpy.partitions(x,3)   #返回的标定点前面比标定点小,后面比标定点大

In [88]: numpy.partition(x,3)
Out[88]: array([ 0,  1,  2,  3,  4,  5, 13,  8,  9,  6, 15, 14,  7, 12, 10, 11])

numpy.argpartitions(x,3) #返回的是索引

3-10 numpy中的比较和FancyIndexing

Fancy Indexing

In [91]: x
Out[91]: array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]
#fancy indexing
In [95]: ind = [3,5,8]
In [96]: x[ind]
Out[96]: array([3, 5, 8])

In [97]: ind = numpy.array([[0,2],[1,3]])
In [98]: x[ind]
Out[98]: 
array([[0, 2],
       [1, 3]])

In [99]: X = x.reshape(4,-1)
In [100]: X
     ...: 
Out[100]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

In [104]: row = numpy.array([0,1,2])
     ...: col = numpy.array([1,2,3])
     ...: X[row,col]
Out[104]: array([ 1,  6, 11])

In [105]: X[0,col]
Out[105]: array([1, 2, 3])

In [106]: X[:2,col]
Out[106]: 
array([[1, 2, 3],
       [5, 6, 7]])
#可以用bool值来表示
In [107]: col = [True,False,True,True]
In [108]: X[1:3,col]
Out[108]: 
array([[ 4,  6,  7],
       [ 8, 10, 11]])

numpy.array的比较

In [109]: x
Out[109]: array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15])
#比较
In [110]: x < 3
Out[110]: 
array([ True,  True,  True, False, False, False, False, False, False,
       False, False, False, False, False, False, False])
#返回符合条件的值的个数
In [111]: numpy.sum(x<=3)
Out[111]: 4
#返回符合条件的值中非零值的个数
In [112]: numpy.count_nonzero(x<=3)
Out[112]: 4
#是否存在为0的数
In [113]: numpy.any(x==0)
Out[113]: True
#是否所有值都>=0
In [116]: numpy.all(x>=0)
Out[116]: True

In [118]: X
Out[118]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

In [119]: numpy.sum(X%2==0)
Out[119]: 8
#从列的方向,即计算每行的偶数的个数
In [120]: numpy.sum(X%2==0,axis=1)
Out[120]: array([2, 2, 2, 2])
#每行中,是否所有元素都>0
In [121]: numpy.all(X>0,axis=1)
Out[121]: array([False,  True,  True,  True])
#与、或、非
In [123]: numpy.sum((x>3)&(x<10))
Out[123]: 6
In [124]: numpy.sum((x%2==0)|(x>10))
Out[124]: 11
In [125]: numpy.sum(~(x==0))
Out[125]: 15
#输出符合条件的具体的值
In [126]: x[x<5]
Out[126]: array([0, 1, 2, 3, 4])
In [127]: x[x%2==0]
Out[127]: array([ 0,  2,  4,  6,  8, 10, 12, 14])
In [128]: X[X[:,3]%3==0]
Out[128]: 
array([[ 0,  1,  2,  3],
       [12, 13, 14, 15]])

 3-11matplotlib数据可视化基础

折线图

In [129]: import matplotlib as mpl
In [130]: import matplotlib.pyplot as plt
#绘图
In [141]: plt.plot(x,siny)
     ...: plt.plot(x,cosy,color="red",linestyle="--")
Out[141]:

 

linestyle:"--"、":"、 "-"、 "-."

#调节x,y两个轴的范围

plt.xlim(-5,15)

plt.ylim(0,1.5)

plt.axis(-1,11,-2,2)  #同时调节x,y轴

plt.xlable("x axis")

plt.ylable("y value")

#增加图示

plt.plot(x,cosy,color="red",linestyle="--",label="cos(x)")

plt.plot(x,siny,label="sin(x)")

plt.legend()

 

#增加标题

plt.title("Welcome to the ML World") 

散点图scatter

plt.scatter(x,siny,alpha = 0.5)  #alpha设置点的透明度

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值