机器学习编程基础(Python)

1 Python函数

1.1 函数定义

  • 函数关键字:必须要有关键字def
  • 函数名:与普通变量命名一致
  • 参数:位置参数、默认参数、可变参、关机字参数
  • 函数体:函数实现的功能
  • 返回值:和C语言一样,一个函数只能有一个返回值

1.2 参数

1.2.1 位置参数

位置参数为函数定义时实现功能所必要的参数,这个参数代替了函数中的一个位置以实现相应的功能。

def sum(x):
    y = x + x
    return y
print(sum(10)) 

这里的x我们就叫做位置参数,需要注意的一点是python中的输出函数可以直接输出变量的值,而C语言中必须要用格式化字符串输出。

1.2.2 默认参数

默认参数在定义函数的时候给出一个默认值(这里的默认值建议使用常量,而非空列表[]这种不确定的变量),在后续函数调用的过程中可以对参数的值进行更改,需要强调的一点是默认参数必须要在位置参数的后面,否则会报错。

# 下面这种情况会报错···
def sum(x = 1, y):
    z = x + y
    return z
print(sum(10, 20))
# 正确的做法···
def sum(x, y = 2):
    z = x + y
    return z
print(sum(10, 20))
# 只有一个默认参数···
def sum(y = 2):
    z = y
    return z
print(sum(20))
# 有两个默认参数,更多也可类推···
def sum(x =1 , y = 2):
    z = x + y
    return z
print(sum(10, 20))

1.2.3 可变参数

可变参数引入了*符号,通过在定义函数参数时在前面加上一个*来表示参数的个数不固定,可能是一个也可能是多个。此时传入的参数可以是列表(list)也可以是元组(tuple),如果使用列表可以将[]省略。注意区分此时的*不再是C语言中指针的概念。

假如我们想计算n个数的和,但是n不确定,可以使用可变参数。

def sum(*nums):
    sum = 0
    for i in nums:
        sum = sum + i
    return sum
print(sum(1,2,3))

1.2.4 关键字参数

关键字参数的作用在于传入的变量会自动转换为字典(dict),定义的格式为**参数名称,在调用时采用名称=值的方式。

def cat(name,age,**kw):
    print('name:',name,'age:',age,'other:',kw)
cat("ergou", 3, male="M", city="Xi`an") # 二狗是一只来自西安的小猫

输出结果为:

name: ergou age: 3 other: {'male': 'M', 'city': 'Xi`an'}

2 Numpy

Numpy是一个支持高维数组与矩阵运算的扩展库,所有通过Numpy生成的对象都为ndarray。

类和对象的概念可以类比C语言结构体和由结构体定义的变量,类可以比作结构体,而对象的概念可以类比于结构体定义的变量。类相比于结构体不仅可以定义一些基本数据类型还可以定义函数,由结构体定义的变量还称之为变量,而由类定义的变量称之为对象。

2.1 创建数组

  • np.array()
import numpy as np
a = np.array([1,2,3]) # 创建一维数组[1,2,3]
b = np.array([[1,2,3], [4,5,6]]) # 创建二维数组[[1,2,3], [4,5,6]]
print("a =\n", a)
print("b =\n", b)

输出结果:

a =
 [1 2 3]
b =
 [[1 2 3]
 [4 5 6]]

2.2 创建随机数组

2.2.1 使用arange和linspace

  • np.arange(start,end,step)

创建从 start 到 end(不包括 end )的随机数组,step 为间隔或步长。

import numpy as np
a = np.arange(0,1,0.1)
print("a =\n", a)

输出结果:

a =
 [0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]
  • np.linspace(start,end,num)

创建从 start 到 end 的随机数组,num 为数组元素的个数。如果想不包括 end 的随机数组,可以在函数内加上endpoint = False

import numpy as np
a = np.linspace(0,1,9)
print("a =\n", a)

输出结果:

a =
 [0.    0.125 0.25  0.375 0.5   0.625 0.75  0.875 1.   ]

2.2.2 使用Numpy下的random模块

  • np.random.rand(x,y)

创建一个 x 行 y 列的数组,其中每个元素的范围为0~1。

import numpy as np
a = np.random.rand(2,2)
print("a =\n", a)

输出结果:

a =
 [[0.316501   0.79346022]
 [0.63625254 0.5903114 ]]
  • np.random.randn(x,y)

创建一个 x 行 y 列的数组,其中每个元素符合标准正态分布。

import numpy as np
a = np.random.randn(2,2)
print("a =\n", a)

输出结果:

a =
 [[-0.38680278 -0.08517162]
 [ 2.63588115  0.15942309]]
  • np.random.randint(start,end,(x,y))

创建一个 x 行 y 列的数组,其中每个元素的范围为start~end(不包括end)。

import numpy as np
a = np.random.randint(1,10,(2,2))
print("a =\n", a)

输出结果:

a =
 [[2 2]
 [6 5]]

2.3 创建其他类型数组

  • np.zeros((x,y))

创建一个 x 行 y 列的数组,其中每个元素都为0。

  • np.ones((x,y))

创建一个 x 行 y 列的数组,其中每个元素都为1。

import numpy as np
a = np.zeros((2,2))
b = np.ones((2,2))
print("a =\n", a)
print("b =\n", b)

输出结果:

a =
 [[0. 0.]
 [0. 0.]]
b =
 [[1. 1.]
 [1. 1.]]
  • np.zeros_like(a)

创建形状和a一样且元素全是0的数组

  • np.ones_like(a)

创建形状和a一样且元素全是1的数组

import numpy as np
a = np.random.randn(2,3)
b = np.zeros_like(a)
c = np.ones_like(a)
print("a =\n", a)
print("b =\n", b)
print("c =\n", c)

输出结果:

a =
 [[ 0.41726975  0.54929402  1.0815317 ]
 [ 0.63351294  1.1521574  -0.31667051]]
b =
 [[0. 0. 0.]
 [0. 0. 0.]]
c =
 [[1. 1. 1.]
 [1. 1. 1.]]

2.4 获取数组的参数

假设a为一个使用numpy创建的数组,要想获取它的形状、元素的数据类型、维度该如何操作呢?

  • a.shape
  • a.dtype
  • a.ndim
import numpy as np
a = np.random.randn(2,3)
print("a.shape =\n", a.shape)
print("a.dtype =\n", a.dtype)
print("a.ndim =\n", a.ndim)

输出结果:

a.shape =  (2, 3)
a.dtype =  float64
a.ndim =  2

2.5 存取数组

2.5.1 一维数组存取

假设我们创建了一个一维数组a,

import numpy as np
a = np.array([4,2,3,5,9,0,6,8,7])

取其中的元素5,可以直接使用a[3]取第4个元素,

print(a[3])

取其中第4个元素和第5个元素,可以采用切片操作a[3:5],注意切片操作不包含末尾的第6个元素,

print(a[3:5])

可以省略开始下标,取前5个元素

print(a[:5])

可以省略末尾下标,取后5个元素

print(a[4:])

可以省略所有下表,取所有元素

print(a[:])

注意如果省略所有下标,可以定义步长(步长为正数表示顺序排列,步长为负数表示倒序排列),例如a[::3]

print(a[::3])
print(a[::-3])

输出结果:

[4 5 6]
[7 0 3]

2.5.2 二维数组存取

二维数组在传统机器学习领域广泛使用,我们采用arange创建一个数组,然后采用reshape方法转化为二维数组,由于python是按照行排列数组,因此转化时也按照行排列。

import numpy as np
a = np.arange(0,25,1).reshape(5,5)
print("a = \n", a)

输出结果:

a = 
 [[ 0  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[:2, 3:]

print(a[:2, 3:])

输出结果:

[[3 4]
 [8 9]]

2.5.3 三位数组存取

三位数组广泛使用在深度学习的特征提取中,例如图像的三通道RGB特征。我们创建一个3行4列5通道的数组,

import numpy as np
a = np.ones(60).reshape(3, 4, 5)
print("a = \n", a)

输出结果:

a = 
 [[[1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]]

 [[1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]]

 [[1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]]]

有人可能会对python表示的三维数组有些疑惑,下面我们用图示表示一下如何理解三维数组。


三维数组1.png
三维数组2.png
三维数组3.png

3 Matplotlib

Matplotlib是python中最常用的可视化工具之一,用处非常大。

3.1 使用Matplotlib下的pyplot模块绘图

import matplotlib.pyplot as plt
import numpy as np
a = np.linspace(0, 10, 100)
b = np.sin(a)
plt.figure(figsize=(8, 4))
plt.plot(a, b)
plt.show()

在这个实例中,我们首先通过导入matplotlib的绘图块pyplot,并重新命名为plt。然后用figure调出一个画布,figsize参数指定画布的宽度和高度,单位是英寸(1英寸为25.4毫米)。创建好画布后,我们就可以用plot()在画布上画图了,plot()的前两个参数分别代表X,Y轴数据的对象。另外plot()参数还可以指定曲线的标签,颜色,线宽等。

figure1.png

还可以加入xlabel、ylabel、title等设置标题,xlim、ylim设置x和y轴的显示范围。

import matplotlib.pyplot as plt
import numpy as np
a = np.linspace(0, 10, 100)
b = np.sin(a)
plt.figure(figsize=(8, 4))
plt.plot(a, b)
plt.xlabel("time")
plt.ylabel("sin(time)")
plt.title("sin-plt")
plt.ylim(-2, 2)
plt.show()
figure2.png

还可以在同一幅图中描述两个波形,并用颜色和线区分。

import matplotlib.pyplot as plt
import numpy as np
a = np.linspace(0, 10, 100)
b = np.sin(a)
c = np.cos(a**2)
plt.figure(figsize=(8, 4))
plt.plot(a, b, color="red", label="sin")
plt.plot(a, c, label="cos")
plt.xlabel("time")
plt.ylabel("sin&cos")
plt.title("plt")
plt.legend(loc=1)
plt.show()

其中,plot参数中的label表示图例的显示字符。

figure3.png

3.2 使用pyplot模块绘制直方图

直方图是一种描述性的统计量,以紧凑的条形图来表明了元素在数组中的个数,在图像处理中经常能用到。

import matplotlib.pyplot as plt
import numpy as np
a = np.random.randn(10000)
plt.figure(figsize=(8,6))
plt.hist(a, bins=40, density=0, facecolor="blue", edgecolor="black")
plt.show()

其中,hist的参数中,a代表直方图绘制的元素,bins代表条形图的个数,density代表是否进行归一化,0代表不归一化,1代表归一化,facecolor代表条形图填充的颜色,edgecolor代表条形图边缘的颜色。

figure4.png

3.3 使用matplotlib读取图像

matplotlib的imread和imshow()提供了图像的读取和显示功能,另外imread()从图像文件中读入数据得到的是一个图像的NumPy数组。

例如,这张图片是日本著名的猫岛上的一处景象。

cute cat.jpeg

下面我们使用imread和imshow来读取和显示。

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

推荐阅读更多精彩内容