机器学习编程基础(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表示的三维数组有些疑惑,下面我们用图示表示一下如何理解三维数组。


机器学习编程基础(Python)_第1张图片
三维数组1.png
机器学习编程基础(Python)_第2张图片
三维数组2.png
机器学习编程基础(Python)_第3张图片
三维数组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()参数还可以指定曲线的标签,颜色,线宽等。

机器学习编程基础(Python)_第4张图片
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()
机器学习编程基础(Python)_第5张图片
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表示图例的显示字符。

机器学习编程基础(Python)_第6张图片
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代表条形图边缘的颜色。

机器学习编程基础(Python)_第7张图片
figure4.png

3.3 使用matplotlib读取图像

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

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

机器学习编程基础(Python)_第8张图片
cute cat.jpeg

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

import matplotlib.pyplot as plt
img = plt.imread("cute cat.jpeg")
plt.imshow(img)
plt.show()
plt_cat.png

你可能感兴趣的:(机器学习编程基础(Python))