机器学习系列(二)——Numpy模块基本操作

在正式进入机器学习算法学习之前,先学习一下常用模块的基本操作。

Numpy.array与python list

导入numpy,查看版本

import numpy as np
np.__version__
#out:'1.15.4'

为什么使用numpy进行数据操作呢,首先看python list和numpy操作数据的不同:

L=[i for i in range(10)]
L
#out:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

python的list非常灵活,元素可以是不同类型,但这也限制了list的性能,每次创建还要进行类型检查。

L[3]='liangliang'
L
#out:[0, 1, 2, 'liangliang', 4, 5, 6, 7, 8, 9]

当然python原生也有限制类型的数组结构,python自带的array模块

import array
ar=array.array("i",[i for i in range(10)])
ar
#out:array('i', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

此时试图修改某元素为其它类型会出现报错。但是,它只是将数据看作数组,无法将数据看成向量和矩阵进行运算。


于是更强大的Numpy.array应运而生。

nparr=np.array([i for i in range(10)])
nparr
#out:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
nparr.dtype#查看数据类型
#out:dtype('int64')
nparr[3]=3.144
nparr
#out:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

创建numpy.array的方法

zeros,ones

zeros,ones等。默认为浮点型数据

l=np.zeros(10)
l
#out:array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
l.dtype
#out:dtype('float64')

若要创建全0整数,则指定dtype
l=np.zeros(10,dtype=int)
其实第一个参数是大小,可以传入创建矩阵
l=np.zeros(shape=(3,4))

#out:array([[0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.]])

若用full,则生成指定数值向量或矩阵,dtype依据fill_value而确定。
l=np.full(shape=(3,4),fill_value=10)

#out:array([[10, 10, 10, 10],
       [10, 10, 10, 10],
       [10, 10, 10, 10]])

注:当显式写出参数名,可以调换各个参数位置。

arange

下面以2为步长,生成0到20间数组,range是不包含终端点的。

l=[i for i in range(0,20,2)]#python中
print('l:',l)
m=np.arange(0,20,2)
print('m:',m)
#out:
    l: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
    m: [ 0  2  4  6  8 10 12 14 16 18]

它们的不同是range中步长不可以是浮点数,而numpy.arange可以是浮点步长,不指定步长则默认为1。

linspace

在0到20之间等长截11个点,是包含首尾端点的

p=np.linspace(0,20,11)
p
#out:array([ 0.,  2.,  4.,  6.,  8., 10., 12., 14., 16., 18., 20.])

random

生成(0,10)之间一个随机的整数,这种方法不包括终端点

np.random.randint(0,10)
#out:6

生成(0,10)之间的向量

np.random.randint(0,10,size=7)
#out:array([0, 3, 1, 8, 2, 9, 9])

size可以指定生成矩阵

np.random.randint(0,10,size=(2,2))
#out:
    array([[9, 3],
           [9, 0]])

设置随机种子可以保证生成的随机数一样,因为计算机中的随机数实际是伪随机数,是随机数生成算法生成的,于是可以设置随机种子。

np.random.seed(2)
np.random.randint(0,10,size=11)
#out:array([8, 8, 6, 2, 8, 7, 2, 1, 5, 4, 4])
np.random.seed(2)
np.random.randint(0,10,size=11)
#out:array([8, 8, 6, 2, 8, 7, 2, 1, 5, 4, 4])

这两次随机生成是一样的。
生成(0,1)之间随机数

np.random.random()
#out:0.35273532

当然可以指定生成向量或矩阵

np.random.random(size=7)
#out:array([0.13457995, 0.51357812, 0.18443987, 0.78533515, 0.85397529, 0.49423684, 0.84656149])

生成标准正太分布随机数

np.random.normal(size=(2,2))
#out:
array([[-0.63765501, -1.18761229],
       [-1.42121723, -0.1534952 ]])

指定均值方差

np.random.normal(0,2,size=(2,2))
#out:
array([[-0.53811392,  4.46273358],
       [-4.86953515,  0.22545301]])

如果有操作不明白,可以查阅文档,学会查阅文档是一项非常有用的技能。如果对一些模块或者函数参数不清楚,可以翻阅文档进行查询:
np.random.normal?这种方式会调出窗口显示文档
//或
help(np.random.normal)这种方式会直接在notebook中打印文档
这是一种非常标准的学习框架的方式。


有小伙伴问我指定矩阵或向量维度时什么时候用参数shape,什么时候用size,答案是随机生成用size,其余情况用shape。

你可能感兴趣的:(机器学习系列(二)——Numpy模块基本操作)