深度学习入门——基于Python的理论与实现(第1章 python入门)

1. Python解释器

1.1 算术计算

除法乘方算术计算,可按如下方式进行。

>>> 7 / 5
1.4
>>> 3 ** 2
9

另外,在Python 2.x中,整数除以整数的结果是整数,比如,7 ÷ 5的结果是1。但在Python 3.x中,整数除以整数的结果是小数(浮点数)

1.2 字典

列表根据索引,按照0, 1, 2, …的顺序存储值,而字典则以键值对的形式存储数据。字典就像《新华字典》那样,将单词和它的含义对应着存储起来。

>>> me = {'height':180} # 生成字典
>>> me['height'] # 访问元素
180
>>> me['weight'] = 70 # 添加新元素
>>> print(me)
{'height': 180, 'weight': 70}

1.3 列表(切片)

除了单一的数值,还可以用列表(数组)汇总数据。元素的访问是通过a[0]这样的方式进行的。[]中的数字称为索引(下标),索引从0开始(索引0对应第一个元素)。此外,Python的列表提供了切片(slicing)这一便捷的标记法。使用切片不仅可以访问某个值,还可以访问列表的子列表(部分列表)。

>>> print(a)
[1, 2, 3, 4, 99]
>>> a[0:2] # 获取索引为0到2(不包括2!)的元素
[1, 2]
>>> a[1:] # 获取从索引为1的元素到最后一个元素
[2, 3, 4, 99]
>>> a[:3] # 获取从第一个元素到索引为3(不包括3!)的元素
[1, 2, 3]
>>> a[:-1] # 获取从第一个元素到最后一个元素的前一个元素之间的元素
[1, 2, 3, 4]
>>> a[:-2] # 获取从第一个元素到最后一个元素的前二个元素之间的元素
[1, 2, 3]

进行列表的切片时,需要写成a[0:2]这样的形式。a[0:2]用于取出从索引为0的元素到索引为2的元素的前一个元素之间的元素。另外,索引−1对应最后一个元素,−2对应最后一个元素的前一个元素。

1.4 函数(取参数)

可以将一连串的处理定义成函数(function)。

>>> def hello():
... print("Hello World!")
...
>>> hello()
Hello World!

此外,函数可以取参数

>>> def hello(object):
... print("Hello " + object + "!")
...
>>> hello("cat")
Hello cat!

另外,字符串的拼接可以使用+。

2. 类

前面我们了解了int和str等数据类型(通过type()函数可以查看对象的类型)。这些数据类型是“内置”的数据类型,是Python中一开始就有的数据类型。现在,我们来定义新的类。如果用户自己定义类的话,就可以自己创建数据类型。此外,也可以定义原创的方法(类的函数)和属性。Python中使用class关键字来定义类,类要遵循下述格式(模板)。

class 类名:
 def __init__(self, 参数,): # 构造函数
 ...
 def 方法名1(self, 参数,): # 方法1
 ...
 def 方法名2(self, 参数,): # 方法2
 ...

这里有一个特殊的__init__方法,这是进行初始化的方法,也称为构造函数(constructor),只在生成类的实例时被调用一次。此外,在方法的第一个参数中明确地写入表示自身(自身的实例)的self是Python的一个特点(学过其他编程语言的人可能会觉得这种写self的方式有一点奇怪)。下面我们通过一个简单的例子来创建一个类。这里将下面的程序保存为man.py。

class Man:
  def __init__(self, name):
     self.name = name
     print("Initialized!")
   def hello(self):
     print("Hello " + self.name + "!")
   def goodbye(self):
     print("Good-bye " + self.name + "!")
m = Man("David")
m.hello()
m.goodbye()

从终端运行man.py。
$ python man.py

Initialized!
Hello David!
Good-bye David!

这里我们定义了一个新类Man。上面的例子中,类Man生成了实例(对象)m。 类Man的构造函数(初始化方法)会接收参数name,然后用这个参数初始化实例变量self.name。实例变量是存储在各个实例中的变量。Python中可以像self.name这样,通过在self后面添加属性名来生成或访问实例变量。

3. numpy

3.1 导入numpy

3.2 生成numpy数组

3.3 numpy的运算

下面是NumPy数组的算术运算的例子。

>>> x = np.array([1.0, 2.0, 3.0])
>>> y = np.array([2.0, 4.0, 6.0])
>>> x + y # 对应元素的加法
array([ 3., 6., 9.])
>>> x - y
array([ -1., -2., -3.])
>>> x * y # element-wise product
array([ 2., 8., 18.])
>>> x / y
array([ 0.5, 0.5, 0.5])

这里需要注意的是,数组x和数组y的元素个数是相同的(两者均是元素个数为3的一维数组)。当x和y的元素个数相同时,可以对各个元素进行算术运算。如果元素个数不同,程序就会报错,所以元素个数保持一致非常重要。另外,“对应元素的”的英文是element-wise,比如“对应元素的乘法”就是element-wise product。NumPy数组不仅可以进行element-wise运算,也可以和单一的数值(标量)组合起来进行运算。此时,需要在NumPy数组的各个元素和标量之间进行运算。这个功能也被称为广播(详见后文)。

>>> x = np.array([1.0, 2.0, 3.0])
>>> x / 2.0
array([ 0.5, 1. , 1.5])

3.4 Numpy的N维数组(N可以理解为深度)

和数组的算术运算一样,矩阵的算术运算也可以在相同形状的矩阵间以对应元素的方式进行。并且,也可以通过标量(单一数值)对矩阵进行算术运算。这也是基于广播的功能。

>>> print(A)
[[1 2]
 [3 4]]
>>> A * 10
array([[ 10, 20],
 [ 30, 40]])

NumPy数组(np.array)可以生成N维数组,即可以生成一维数组、二维数组、三维数组等任意维数的数组。数学上将一维数组称为向量,将二维数组称为矩阵。另外,可以将一般化之后的向量或矩阵等统称为张量(tensor)。
基本上将二维数组称为“矩阵”,将三维数组及三维以上的数组称为“张量”或“多维数组”。

3.5 广播

NumPy中,形状不同的数组之间也可以进行运算。之前的例子中,在2×2的矩阵A和标量10之间进行了乘法运算。在这个过程中,如图所示,标量10被扩展成了2 × 2的形状,然后再与矩阵A进行乘法运算。这个巧妙的功能称为广播(broadcast)。
广播的例子:标量10被当作2 × 2的矩阵
我们通过下面这个运算再来看一个广播的例子。

>>> A = np.array([[1, 2], [3, 4]])
>>> B = np.array([10, 20])
>>> A * B
array([[ 10, 40],
 [ 30, 80]])

在这个运算中,如图所示,一维数组B被“巧妙地”变成了和二位数组A相同的形状,然后再以对应元素的方式进行运算。
广播例子2
综上,因为NumPy有广播功能,所以不同形状的数组之间也可以顺利地进行运算

3.6 访问元素

元素的索引从0开始。对各个元素可按索引法进行访问。除此之外,还可以引入数组法。

>>> X = X.flatten() # 将X转换为一维数组
>>> print(X)
[51 55 14 19 0 4]
>>> X[np.array([0, 2, 4])] # 获取索引为0、2、4的元素
array([51, 14, 0])

运用这个标记法,可以获取满足一定条件的元素。例如,要从X中抽出大于15的元素,可以写成如下形式。

>>> X > 15
array([ True, True, False, True, False, False], dtype=bool)
>>> X[X>15]
array([51, 55, 19])

对NumPy数组使用不等号运算符等(上例中是X > 15),结果会得到一个布尔型的数组。上例中就是使用这个布尔型数组取出了数组的各个元素(取出True对应的元素)。

4. Matplotlib

4.1 绘制简单图形

可以使用matplotlib的pyplot模块绘制图形。话不多说,我们来看一个绘制sin函数曲线的例子。

import numpy as np
import matplotlib.pyplot as plt
#生成数据
x = np.arange(0, 6, 0.1) # 以0.1为单位,生成0到6的数据
y = np.sin(x)
#绘制图形
plt.plot(x, y)
plt.show()

这里使用NumPy的arange方法生成了[0, 0.1, 0.2, … , 5.8, 5.9]的数据,将其设为x。对x的各个元素,应用NumPy的sin函数np.sin(),将x、 y的数据传给plt.plot方法,然后绘制图形。最后,通plt.show()显示图形。运行上述代码后,就会显示sin函数的图形。

4.2 pyplot的功能

import numpy as np
import matplotlib.pyplot as plt
# 生成数据
x = np.arange(0, 6, 0.1) # 以0.1为单位,生成0到6的数据
y1 = np.sin(x)
y2 = np.cos(x)
# 绘制图形
plt.plot(x, y1, label="sin")
plt.plot(x, y2, linestyle = "--", label="cos") # 用虚线绘制
plt.xlabel("x") # x轴标签
plt.ylabel("y") # y轴标签
plt.title('sin & cos') # 标题
plt.legend()
plt.show()

sin函数和cos函数

4.3 显示图像

pyplot 中还提供了用于显示图像的方法 imshow()。另外,可以使用matplotlib.image模块的imread()方法读入图像。

import matplotlib.pyplot as plt
from matplotlib.image import imread
img = imread('../dataset/lena.png') # 读入图像(设定合适的路径!)
plt.imshow(img)
plt.show()

运行上述代码后,会显示图像。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张十三、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值