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表示的三维数组有些疑惑,下面我们用图示表示一下如何理解三维数组。
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()参数还可以指定曲线的标签,颜色,线宽等。
还可以加入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()
还可以在同一幅图中描述两个波形,并用颜色和线区分。
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表示图例的显示字符。
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代表条形图边缘的颜色。
3.3 使用matplotlib读取图像
matplotlib的imread和imshow()提供了图像的读取和显示功能,另外imread()从图像文件中读入数据得到的是一个图像的NumPy数组。
例如,这张图片是日本著名的猫岛上的一处景象。
下面我们使用imread和imshow来读取和显示。
import matplotlib.pyplot as plt
img = plt.imread("cute cat.jpeg")
plt.imshow(img)
plt.show()