第一章 机器学习基础(1) Numpy

机器学习基础(1) Numpy

1.Nmupy概述

	NumPy(Numerical Python)是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix)),支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库
															--from 百度百科

​ Numpy提供了一个N维数类型nArray,其描述了相同的数据类型“items"的集合。

Numpy和python原生的list的区别:

img

	从图中我们可以看出ndarray在存储数据的时候,数据与数据的地址都是连续的,这样就给使得批量操作数组元素时速度更快。
	这是因为ndarray中的所有元素的类型都是相同的,而Python列表中的元素类型是任意的,所以ndarray在存储元素时内存可以连续,而python原生list就只能通过寻址方式找到下一个元素,这虽然也导致了在通用性能方面Numpy的ndarray不及Python原生list,但在科学计算中,Numpy的ndarray就可以省掉很多循环语句,代码使用方面比Python原生list简单的多。

2. Numpy的基本操作

本次教程设计的初衷只为了方便操作读取机器学习所提供的dataSet,因此比较浅显,如果想继续深入了解Numpy,请移步全球最大的同性交友平台gayHubNumpy中文文档地址

2.1 基本操作–取值、改值

​ 如果需要使用Numpy,则首先应该安装Numpy库,个人建议使用Anaconda进行安装。安装教程请移步Anaconda安装

​ 如果你已经有了Numpy库,则完全可以忽略上面那一步,在编译器中输入import numpy as np导入包,快快地和妲己愉快的玩耍吧~

​ 好了,不滑稽了~下面开始正题。首先导入操作所需要的先导数据。

## Numpy
import numpy as np  #导入包

##案例涉及的数值
a = np.array(['a','b','c','d','e'])
b = np.array([1,2,3,4,5])
c = np.array([6,7,8,9,10])
d = np.eye(4)   
print("a ===>",a)
print("b ===>",b)
print("c ===>",c)
print("d ===>",d)

所得到的结果为:

a ===> ['a' 'b' 'c' 'd' 'e']
b ===> [1 2 3 4 5]
c ===> [ 6  7  8  9 10]
d ===> [[1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 1. 0.]
 [0. 0. 0. 1.]]

之后开始进行读取和操作:

##读取,修改
print(a[1])  ##output:'b'

##读取二维数组的指定值
print(d[1,1])  ##output:1.0

#读取1行
print(d[1])  ##output:[0. 1. 0. 0.]

#读取1列(ps:之所以不用d[:,2],是因为numpy是按照行存储,即二维矩阵的矩阵压缩)
print(d[:,2])  #output:[0. 0. 1. 0.]

##修改二维数组  
d[1,2] = 3
print(d) 
"""结果为:
[[1. 0. 0. 0.]
 [0. 1. 3. 0.]
 [0. 0. 1. 0.]
 [0. 0. 0. 1.]]"""

2.2 基本操作–矩阵运算

## 矩阵的四则运算
##加
print(b+c)  #output:[ 7  9 11 13 15]

#减
print(b-c) #output:[-5 -5 -5 -5 -5]

#乘
print(b*c) #output:[ 6 14 24 36 50]

#除
print(b/c) #output:[0.16666667 0.28571429 0.375      0.44444444 0.5       ]

#次方运算
print(b**2) #output:[ 1  4  9 16 25]

2.3 基本操作–矩阵性质

在机器学习中,有很多地方需要知道矩阵的性质,比如维度,类型等。

##shape 返回各维度的长度 ,其返回值为一个元组
print(a.shape)  #output:(5,)
print(d.shape)  #output:(4, 4)

##维度运算  ndim
print(a.ndim) #1  ===>一维数组
print(d.ndim) #2 ===>二维数组

###dtype  查看numpy的类型
print(a.dtype)  #output:<U1
print(d.dtype)  #output:float64

##指定数据类型
arr = np.array([1,2.2,3,3.2],dtype="int32")
print(arr,arr.dtype)  #output:[1 2 3 3] int32
##如果遇到无法转换的数据类型,则会报错
##arr1 = ['1','2.2','a','ier',dtype="int32"]
##print(arr1)

##numpy数据类型的转换需要使用astype(),返回值是修改后的数据类型,而原始元组不变
arr = np.array([1,2.2,3.0,4,5,6.6])
e1 = arr.astype(int)
print(e1,e1.dtype) #output:[1 2 3 4 5 6] int32

e2 = arr.astype(np.str) ' '6.6'] 
print(e2,e2.dtype) #output:['1.0' '2.2' '3.0' '4.0' '5.0'] <U32

##显示最大元素的字节数 itemsize
print(a.itemsize) #output:4

##总元素字节数  nbytes
print(d.nbytes) #output:128

2.4 基本操作–Numpy函数

在机器学习中,有时候也会用到Numpy函数,比如tile,fill等,下面就跟随小弟一起来看看吧~

#fill 用指定的元素填充元组
# a.fill('a')
print(a) ##output:['a' 'a' 'a' 'a' 'a']

##重塑 reshape 在不改变原始数据的情况下,重新按指定形状生成数组
##array.reshape(a,b) 将array重组为a行b列的list
a = np.arange(1,25)  #np.arange(start,end)函数生成一个从start~end-1的list
#output:[ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24]

##如果元素个数不匹配,则会报错
#a.reshape(4,5) #output:ValueError

print(a.reshape(4,6))
#output:
'''
[[ 1  2  3  4  5  6]
 [ 7  8  9 10 11 12]
 [13 14 15 16 17 18]
 [19 20 21 22 23 24]]
'''
###求和  sum种有一个axis的参数,能够指定列进行求和
'''
    假设a的形状是一个(2,3,2)的数组,则:
        IF axis=0(-3) THEN a在第0维(倒数第3维)上求和,得到一个(3,2)的数组
        IF axis=1(-2) THEN a在第1维(倒数第2维)上求和,得到一个(2,2)的数组
        IF axis=2(-1) THEN a在第2维(倒数第1维)上求和,得到一个(2,3)的数组
'''
a = np.arange(12).reshape(2,3,2)
'''
[[[ 0  1]
  [ 2  3]
  [ 4  5]]

 [[ 6  7]
  [ 8  9]
  [10 11]]]
'''
a_0 = a.sum(axis=0)
a_1 = a.sum(axis=1)
a_2 = a.sum(axis=2)

print(a_0,a_0.shape) #output: [[ 6  8][10 12][14 16]] (3, 2)
print(a_1,a_1.shape) #output:[[ 6  9][24 27]] (2, 2)
print(a_2,a_2.shape) #output: [[ 1  5  9][13 17 21]] (2, 3)

##tile函数 将原矩阵横向、纵向地复制。
##tile是瓷砖的意思,顾名思义,就是将矩阵像贴瓷砖一样平铺开来
##tile(matrix,(a,b)):先将matrix横向平铺b个,再将其纵向平铺a个。
import numpy as np
mat = np.array([[1,2],[3,4]])
print(mat)
tile(mat,4) #等于 tile(mat,(1,4)) ===>横向平铺4次 即[[1 2 1 2 1 2 1 2] [3 4 3 4 3 4 3 4]]

tile(mat,(3,1)) #纵向平铺3次,即[[1 2] [3 4][1 2] [3 4] [1 2] [3 4]]

#横向+纵向
tile(mat, (3, 4))
'''
结果:
[[1 2 1 2 1 2 1 2]
 [3 4 3 4 3 4 3 4]
 [1 2 1 2 1 2 1 2]
 [3 4 3 4 3 4 3 4]
 [1 2 1 2 1 2 1 2]
 [3 4 3 4 3 4 3 4]]
'''

2.5 基本操作–索引

索引被用于各种取数和循环等基本操作中,所以这个chapter非常的重要,但是非常的简单

##索引操作
#正索引         1,2,3,4,5,6
#负索引        -6,-5,-4,-3,-2,-1
a = np.array([10,5,8,9,2,1,64])
b = np.arange(20).reshape(4,5)

#切片
##一维切片
print(a[1:3])  #a[start:end]  start~end-1

print(a[3:])  #a[index:] start~最后一个元素

print(a[:3]) #a[:end] 第一个元素开始~a[3]

##负索引
print(a[-4:-2]) #a[-start,-end] 倒数第start个开始,一直到倒数第end+1结束

#a[::index] 每间隔index-1取一次
print(a[::2]) 

#区间跳转 a[开始:结束:间隔]
b = np.arange(10) #[0 1 2 3 4 5 6 7 8 9]
print(b[1:7:2]) #[1 3 5]


写在最后:

各位同学,请你们记住,在计算机领域中,最重要的事情是什么呢?实践别人的东西终究是别人的,只有实践才能够将别人的东西转化成自己的,相信你们一定能够行的,加油~

最后,如果有志同道合的朋友想一起讨论的,请加QQ群【662151913】萌新AI的入坑之旅

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值