人工智能学习基础
四剑客(库)
Python被大量应用在数据挖掘和深度学习领域,其中使用极其广泛的是Numpy(N维数组对象和向量运算)、Pandas(是建立在Numpy基础.上的高效数据分析处理库,是Python的重要数据分析库。)、 Matplotlib(一个主要用于绘制二维图形的Python库。用于绘图、可视化)、 PIL(一个具有强大图像处理能力的第三方库。用于图像处理)等库
Numpy就是用来进行矩阵计算的,而Pandas则基于Numpy ,丰富并简化了Numpy的操作
Numpy ( Numerical Python)
是高性能科学计算和数据分析的基础包,其部分功能如下:
ndarray ,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。
用于对整组数据进行快速运算的标准数学函数(无需编写循环)。
用于读写磁盘数据的工具以及用于操作内存映射文件的工具。
线性代数、随机数生成以及傅里叶变换功能。
推荐:Numpy中文网
使用
创建数组,最简单的办法是使用array函数
它接受-切序列型的对象(包括其他数组) ,然后产生一个新的含有传入数据的Numpy数组 ,其中,嵌套序列(比如由- -组等 长列表组成的列表)将会被转换为一个多维数组
除了np.array之外,还有一些函数也可以新建数组 :
zeros和ones分别可以创建指定长度或者形状的全0或全1数组
empty可以创建一个没有任何具体值的数组
import numpy as np
a=[1,2,3,4] #创建简单的列表
b=np.array(a) #将列表转换为数组
b #array([1,2,3,4])
#创建10行10列的数值为浮点0的矩阵
array_ zero = np.zeros([10,10])
#创建10行10列的数值为浮点1的矩阵
array_ one = np.ones([10,10])
创建随机数组
#均匀分布
np.random.rand(10, 10) #创建指定形状(示例为10行10列)的数组(范围在0至1之间)
np.random.uniform(0, 100) #创建指定范围内的一个数
np.random.randint(O, 100) #创建指定范围内的一个整数
#正态分布
np.random.normal(1.75, 0.1, (2,3)) #给定均值/标准差/维度的正态分布
查看数组的属性
数组与标量之间的计算
numpy数组通常叫做失量,大小相等的数组之间的任何算数运算都会将运算应用到元素集,同样,数组与标量的算术运算也会将那个标量值传播到各个元素。
比如:
** 表示取次方
数组的索引与切片
跟列表最重要的区别在于,数组切片是原始数组的视图,这意味着数据不会被复制,视图上的
任何修改都会直接反映到源数组上
将一个标量值赋值给-一个切片时,该值会自动传播到整个选区
arr = np.arange( 10)
arr #array([0, 1,2,3,4,5, 6, 7, 8, 9])
arr[5] #5
arr[5:8] #array([5, 6, 7])
arr[5:8]= 12
arr #array([0, 1, 2, 3, 4, 12, 12, 12, 8, 9])
arr_ slice = arr[5:8]
arr_ slice[1]= 12345
arr #array([0, 1, 2, 3, 4, 12, 12345, 12, 8, 9])
arr_ slice[:]= 64
arr #array([0, 1, 2, 3, 4, 64, 64, 64, 8, 9])
注意:
arr[5:8]= 16
与arr_ slice = arr[5:8]+arr_ slice[:]= 16
效果等同
传入一个以逗号隔开的索引列表来选取单个元素
第一个可能由于输出的方式不太好理解
[[ 1, 2, 3],[4, 5, 61],
[[7, 8, 9],[10, 11, 121]]
同时由代码可得:arr3d[0][1]
效果等同于arr3d[0,1]
数学与统计方法
可以通过数组上的一组数学函数对整个数组或某个轴向的数据进行统计计算
sum、 mean以及标准差std等聚合计算既可以当做数组的实例方法调用,也可以当做顶级Numpy函数使用
arr = np.random.randn(5, 4) #正态分布的数据
# 平均值
arr.mean() #-0.022341797127577216 调用数组的实用方法
np.mean(arr) # -0.022341797127577216 Numpy封装好的函数
arr.sum() #-0.44683594255154435
mean和sum这类的函数可以接受一个axis参数(用于计算该轴向上的统计值),最终结果是一个少一维的数组
axis = 0,指的就是跨行,也就是沿着行标签index垂直向下执行。
axis = 1,指的是跨列,也就是沿着列名水平方向执行
arr.mean(axis=1) #array([-0.11320162, -0.032351 ,-0.24522299, 0.13275031, 0.14631631])
arr.sum(0) #array([-1.7 1093252, 3.4431099,-1.78081725, -0.39819607])
基本数组统计方法
线性代数
Numpy提供了一个用于矩阵乘法的dot函数(既是一个数组方法,也是Numpy命名空间中的一个函数)
x = np.array([1., 2., 3.],[4., 5., 6.])
y = nparay([6., 23.],[-1, 7], [8, 9])
X
y
arry([1., 2., 3.],
[4.,5., 6.])
array([[ 6., 23.],
[-1., 7.],
[8., 9.1])
x.dot(y) #相当于np.dot(x, y),向量点积和矩阵乘法
array([[ 28., 64.],
[ 67., 181.1])
相关函数
Pandas
Pandas是Python第三方库,提供高性能易用数据类型和分析工具
Pandas基于Numpy实现,常与Numpy和matplotlib一同使用 Pandas中有两大核心数据结构:Series(
一维数据)和DataFrame(多特征数据,既有行索引,又有列索引 )
使用
Series
Series是一种类似于一维数组的对象,它由一维数组 (各种Numpy数据类型)以及一组与之相关的数据标签(即索引)组成
Series的创建:使用Python数组创建,使用Numpy数组创建,使用Python字典创建
Series的字符串表现形式为:索引在左边,值在右边。如果没有为数据指定索引,则自动创建一个0到N-1 ( N为数据的长度)的整数型索引
可以通过Series的values和index属性获取其数组表示形式和索引对象
与普通Numpy数组相比,可以通过索引的方式选取Series中的单个或一组值
注意:与字典不同的是: Series允许索引重复
import Pandas as pd
import Numpy as np
pd.Series([11, 12],index=["北京","上海")
北京
11
上海
12
dtype: int64
pd. Series(np.arange(3,6)) #填入二个参数,起点为参数3,终点为参数6,步长为1(代码上未显示相等于(3,6,1))
0 3
1 4
2 5
dtype: int32
pd.Series({北京": 11,"上海": 12, "深圳": 14})
北京 11
上海 12
深圳 14
dtype: int64
obj = pd.Series([4, 7,-5, 3])
obj.values #array([4, 7, -5, 3], dtype=int64)
obj.index #RangeIndex(start=0, stop=4, step=1)
obj[2] #-5
obj[1]= 8
obj[[0, 1, 3]]
0 4
1 8
3 3
dtype: int64
Series中最重要的一个功能是:它会在算术运算中自动对齐不同索引的数据
obj2 = pd .Series({"Ohio": 35000,"Oregon": 16000, "Texas": 7 1000, "Utah": 5000})
obj3 = pd .Series({"California": np.nan, "Ohio": 35000,"Oregon": 16000, "Texas": 71000})
obj2 + obj3
Series对象本身及其索弓|都有一个name属性,该属性跟Pandas其他的关键功能关系非常密切
Series的索引可以通过赋值的方式就地修改
obj3.name= 'population'
obj3.index.name = 'state'
obj3
state
California NaN
Ohio 35000.0
Oregon 16000.0
Texas 71000.0
Name: population, dtype: float64
obj = pd.Series([4, 7, -5,3])
obj.index = ['Bob', 'Steve', 'Jeff, 'Ryan']
obj
Bob 4
Steve 7
Jeff -5
Ryan 3
dtype: int64
DataFrame
DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)
DataFrame既有行索弓|也有列索引,它可以被看做由Series组成的字典(共用同一个索引)跟其他类似的数据结构相比(如R语言的data.frame) , DataFrame中面向行和面向列的操作基本上是平衡的
构成DataFrame的方法很多,最常用的一种是直接传入- -个由等长列表或Numpy数组组成的字典
DataFrame结果会自动加.上索引(跟Series-样), 且全部会被有序排列
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'], 'year': [2000
2001, 2002,2001, 2002],'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}
frame = pd.DataFrame(data)
frame
如果指定了列顺序,则DataFrame的列就会按照指定顺序进行排列
跟原Series- -样 ,如果传入的列在数据中找不到,就会产生NAN值
pd.DataFrame(data,columns='year', 'state', 'pop'])
frame2 = pd.DataFrame(data, columns=['year', 'state','pop', 'debt'], index=['one', 'two', 'three', 'four', 'five'])
frame2
frame2.columns #Index(['year', 'state', 'pop', 'debt'], dtype= object')
列可以通过赋值的方式进行修改例如,给"debt" 列赋上一个标量值或一组值
frame2['debt]= 16.5
frame2
frame2['debt]= np.arange(5.)
frame2
将列表或数组赋值给某个列时,其长度必须跟DataFrame的长度相匹配
如果赋值的是一个Series ,就会精确匹配DataFrame的索引,所有空位都将被填上缺失值
val = pd.Series([-1.2, -1.5, -1.7], index=[two', 'four', 'five'])
frame2['debt'] = val
frame2
为不存在的列赋值会创建出一个新列
关键字del用于删除列
frame2'eastern'] = frame2.state == 'Ohio'
frame2
>>> del frame2[eastern']
>>> frame2.columns #Index(['year', 'state', 'pop', 'debt], dtype='object")
将嵌套字典(也就是字典的字典)传给DataFrame ,它就会被解释为:外层字典的键作为列,内层键则作为行索引
也可以对上述结果进行转置
pop = {Nevada': {2001: 2.4, 2002: 2.9},'Ohio'
{2000: 1.5, 2001: 1.7, 2002
3.6}}
frame3 = pd.DataFrame(pop)
frame3
Nevada Ohio
2000 NaN 1.5
2001 2.4 1.7
2002 2.9 3.6
frame3.T #转置
2000 2001 2002
Nevada NaN 2.4 2.9
Ohio 1.5 1.7 3.6
如果设置了DataFrame的index和columns的name属性,则这些信息也会被显示出来
frame3.index.name = 'year'
frame3. columns.name = 'state'
frame3
跟Series-样, values属性也会以二维ndarray的形式返回DataFrame中的数据
如果DataFrame各列的数据类型不同,则数组的数据类型就会选用能兼容所有列的数据类型
frame3.values
array([nan, 1.5],
[2.4, 1.7],
[2.9, 3.6])
Pandas
Pandas的索引对象负责管理轴标签和其他元数据(比如轴名称等)
构建DataFrame时,所用到的任何数组或其他序列的标签都会被转换成一个Index
Index对象是不可修改的,因此用户不能对其进行修改
obj = pd.Series(range(3), index=['a', 'b', 'c'])
index = obj.index
index #Index:([a', 'b', 'c'], dtype='object")
index[1:] #Index("b', 'c], dtype='object)
Pandas的每个索引都有一些方法和属性,它们可用于设置逻辑并回答有关该索引包含的数据的常见问题。
列出了Index的方法和属性
Matplotlib
Matplotib库由各种可视化类构成,内部结构复杂受Matlab启发,matplotlib.pylot是绘制各类可视化图形的命令字库,相当于快捷方式
使用
plt.plot()只有一个输入列表或数组时 ,参数被当做Y轴, X轴以索引自动生成
plt.plot(x, y)当有两个以上参数时,按照x轴和y轴顺序绘制数据点
plt.savefig(将输出图形存储为文件,默认PNG格式,可以通过dpi修改输出质量
plt.subplot(nrows, ncols,plot number)在全局绘图区域中创建一个分区体系并定位到一个子绘图区域
import matplotlib.pyplot as plt
plt.plot(3, 1,4, 5,2]) #[<matplotlib.lines.Line2D object at0x000000000B2A0978>]
pltylabel("Grade") #Text(O, 0.5, 'Grade')
plt.savefig("test", dpi=600) # PNG文件
plt.show()
基础函数
#饼图
import matplotib.pyplot as plt
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
sizes =[15, 30, 45, 10]
explode=(0,0.1, 0, 0)
plt.pie(sizes, explode=explode, labels=labels,autopct=' %1.1f%',shadow=False, startangle=90)
pltaxis( equal)
plt.show()
#直方图(条形)
import matplotlib .pyplot as plt
import Numpy as np
np.random.seed(0)
mu, sigma = 100, 20 #均值和标准值
a = np.random.normal(mu, sigma,size= 100)
plt.hist(a, 20, normed=1,histtype=' stepfilled', facecolor="b', alpha=0.75)
pt.tle(Histogram')
plt.show()
#散点图
import Numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot(10*np.random.randn(100),10*np.random.randn(100), 'o')
ax.set t('Simple Scatter')Tex:(0.5, 1.0, 'Simple Scater')
plt.show()
PIL库
是一个具有强大图像处理能力的第三方库,Image是PIL库中代表一 个图像的类(对象)
图像是一个由像素组成的二维矩阵每个元素是一个RGB值,读取图片,并进行45°旋转,然后进行可视化
from PIL import Image
im = Image.open(test.png) #读取图片
im.rotate(45).show() #将图片旋转,并用系统自带的图片工具显示图片
创建缩略图
缩略图不能直接双击打开,要使用PIL.Image的open读取,然后使用show()方法进行显示。
from PIL import Image
import glob, oS
size = 128, 128
for infle in glob.glob(* jpg') # glob的作用是文件搜索,返回一个列表
...file, ext = os.path.splitext(infile) #将文件名和扩展名分开,用于之后的重命名保存
...im = Image open(infile)
...im.thumbnail(size, Image.ANTIALIAS) #等比例缩放
...im.save(ile + '.thumbnail', JPEG)
图片的融合
常用的图片的融合或者合成函数如下
PIL.image.alpha_ composite(im1,im2)
PIL.image.blend(im1,im2,alpha)
PIL.Image.composite(im1,im2,mask)
上述方法要求im1和im2的mode和size要一致; alpha代表图片占比的意思; mask是mode可以为”1”;“L"或者”RGBA”(彩色或者灰度)
例:
Image.convert(mode=None,matrix= None,dither= None,palette=0,color=256)
实现图像的灰度化处理
Image.copy() #将读取的图片复制- -份
from PIL import Image
im = Image.open(test.png)
im = im.convert("L")
im.show()
获取图片的基本信息
from PIL import Image
im = Image .open(test.png") #读取图片
bands = im.getbands() #显示该图像的所有通道,返回一个tuple
bands #('R','G';, 'B', 'A')
bboxs = im.getbbox() #返回一个像素坐标
bboxs #(O, 0, 238, 295)
图像粘贴操作
Image.paste(im, box=None, maske=None)
使用im粘贴到原图片中
两个图片的mode和size要求一致,不一致可以使用convert()和resize()进行调整