人工智能学习笔记01 python的基本使用方法

目录

参考书:

安装python

python的基本用法 

不同版本上运行算数运算的区别

 python的类型概念​编辑

变量的定义计算赋值​编辑​编辑 

动态类型语言 

列表

切片方法实现部分访问列表

字典

布尔型 (bool)

if语句

 空白字符

for 语句

函数

传入参数的函数

字符串的拼接

关闭Python解释器

Python脚本文件

 NumPy

导入NumPy

生成NumPy数组 

NumPy 数组的算术运算 

NumPy的N维数组

矩阵的算数运算

广播

​编辑 访问元素

可指定访问的元素。

用循环访问元素

使用数组访问各个元素

按条件访问

包的本质

Matplotlib


参考书: 

安装python

anaconda这个发行版是集成了必要的库的适合数据分析和科学计算的版本。

在官网下载这个版本并安装后,在cmd中查询版本发现不对。定位到目录发现当前运行的版本是以前安装的老版本。通过修改环境变量,实现运行anaconda这个发行版本

python的基本用法 

不同版本上运行算数运算的区别

不同版本运行算数运算的差别

 python的类型概念

变量的定义计算赋值 

 

动态类型语言 

Python是属于“动态类型语言”的编程语言,所谓动态,是指变量的类 型是根据情况自动决定的。

整数和小数相乘的结果是小数(数据类型的 自动转换)。

另外,“#”是注释的意思,它后面的文字会被Python忽略。 

列表

以用列表(数组)汇总数据

[]中的数字称为索引(下标), 索引从0开始(索引0对应第一个元素)。

>>> a = [1, 2, 3, 4, 5] # 生成列表
>>> print(a) # 输出列表的内容
[1, 2, 3, 4, 5]
>>> len(a) # 获取列表的长度
5
>>> a[0] # 访问第一个元素的值
1
>>> a[4]
5
>>> a[4] = 99 # 赋值
>>> print(a)
[1, 2, 3, 4, 99]

切片方法实现部分访问列表

>>> 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]

字典

字典以键值对的形式存储数据 

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

布尔型 (bool)

 bool型取True或False中的一个值。运算符包括and、or和not

>>> hungry = True # 饿了
>>> sleepy = False # 困了
>>> type(hungry)
<class 'bool'>
>>> not hungry
False
>>> hungry and sleepy # 饿并且困
False
>>> hungry or sleepy # 饿或者困
True

if语句

>>> hungry = True
>>> if hungry:
... print("I'm hungry")
...
I'm hungry
>>> hungry = False
>>> if hungry:
... print("I'm hungry") # 使用空白字符进行缩进
... else:
... print("I'm not hungry")
... print("I'm sleepy")
...
I'm not hungry
I'm sleepy

 空白字符

具有重要的意义。上面的if语句中,if hungry:下面 的语句开头有4个空白字符。它是缩进的意思,表示当前面的条件(if hungry) 成立时,此处的代码会被执行。这个缩进也可以用tab表示,Python中推荐 使用空白字符。 Python使用空白字符表示缩进。一般而言,每缩进一次,使用 4 个空白字符。

for 语句

按顺序访问列表等数据结构中的各个元素

>>> for i in [1, 2, 3]:
... print(i)
...
1
2
3

函数

将一连串的处理定义成函数

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

传入参数的函数

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

字符串的拼接

使用+。(见上一段代码)

关闭Python解释器

Linux或Mac OS X的情况下输入Ctrl-D

Windows的情况下输入Ctrl-Z,然后按Enter键

Python脚本文件

将 Python程序保存为文件,然后(集中地)运行

编辑文本

print("I'm hungry!")

使用脚本解释器运行这个文本(在bash中)

$ cd ~/deep-learning-from-scratch/ch01 # 移动目录
$ python hungry.py
I'm hungry!

类比数据类型

自定义新的类和方法(函数)属性

模板:

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

这里有一个特殊的__init__方法,这是进行初始化的方法,也称为构造 函数(constructor),只在生成类的实例时被调用一次。

此外,在方法的第一 个参数中明确地写入表示自身(自身的实例)的self是Python的一个特点(学 过其他编程语言的人可能会觉得这种写self的方式有一点奇怪)

class Man:
 def __init__(self, name):
 self.name = 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()

运行: 

$ python man.py
Initialized!
Hello David!
Good-bye David!

这里我们定义了一个新类Man。上面的例子中,类Man生成了实例(对象)m。

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

 NumPy

数组和矩阵的计算。NumPy的数组类 (numpy.array)中提供了很多便捷的方法

导入NumPy

NumPy是外部库。这里所说的“外部”是指不包含在标准版Python中。 因此,我们首先要导入NumPy库。

Python 中使用 import语句来导入库。

>>> import numpy as np

将numpy作为np导入。通过写成这样的形式,之后 NumPy相关的方法均可通过np来调用。

生成NumPy数组 

使用np.array()方法。np.array()接收Python 列表作为参数,生成NumPy数组(numpy.array)。

>>> x = np.array([1.0, 2.0, 3.0])
>>> print(x)
[ 1. 2. 3.]
>>> type(x)
<class 'numpy.ndarray'>

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的元素个数相同时,可以对各个元素进行算术运算。如果元素个数不同,程序就会报错。

#元素个数不同导致报错的情况
>>> import numpy as np
>>> x = np.array([1.0,2.0,3.0])
>>> y = np.array([2.0,4.0,6.0,8.0])
>>> x + y
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (3,) (4,)
#广播,见后文
>>> x = np.array([1.0, 2.0, 3.0])
>>> x / 2.0
array([ 0.5, 1. , 1.5])

NumPy的N维数组

>>> A = np.array([[1, 2], [3, 4]])
>>> print(A)
[[1 2]
 [3 4]]
>>> A.shape
(2, 2)
>>> A.dtype
dtype('int64')

矩阵A的形状可以通过shape查看,

矩阵元素的数据类型可以通过dtype查看。

矩阵的算数运算

在相同形状的矩阵之间以对应元素的方式进行

#相同形状的矩阵之间的算数运算
>>> B = np.array([[3, 0],[0, 6]])
>>> A + B
array([[ 4, 2],
 [ 3, 10]])
>>> A * B
array([[ 3, 0],
 [ 0, 24]])

 通过标量(单一数值)基于广播对矩阵进行算数运算。

#基于广播的矩阵于标量之间的算数运算
>>> print(A)
[[1 2]
 [3 4]]
>>> A * 10
array([[ 10, 20],
 [ 30, 40]])

 NumPy数组(np.array)可以生成N维数组,即任意维数的数组。

数学上将一维数组称为向量, 将二维数组称为矩阵。

另外,可以将一般化之后的向量或矩阵等统 称为张量(tensor)。

本书基本上将二维数组称为“矩阵”,将三维数 组及三维以上的数组称为“张量”或“多维数组”。

广播

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

#一维数组通过广播变成矩阵参与运算
>>> A = np.array([[1, 2], [3, 4]])
>>> B = np.array([10, 20])
>>> A * B
array([[ 10, 40],
 [ 30, 80]])

 访问元素

元素的索引从0开始。

可指定访问的元素。

>>> X = np.array([[51, 55], [14, 19], [0, 4]])
>>> print(X)
[[51 55]
 [14 19]
 [ 0 4]]
>>> X[0] # 第0行
array([51, 55])
>>> X[0][1] # (0,1)的元素
55

用循环访问元素

>>> for row in X:
... print(row)
...
[51 55]
[14 19]
[0 4]

使用数组访问各个元素

>>> 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
array([ True, True, False, True, False, False], dtype=bool)
>>> X[X>15]
array([51, 55, 19])

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

包的本质

Python等动态类型语言一般比C和C++等静态类型语言(编译型语言) 运算速度慢。实际上,如果是运算量大的处理对象,用 C/C++写程 序更好。为此,当 Python中追求性能时,人们会用 C/C++来实现 处理的内容。Python则承担“中间人”的角色,负责调用那些用 C/ C++写的程序。NumPy中,主要的处理也都是通过C或C++实现的。 因此,我们可以在不损失性能的情况下,使用 Python便利的语法。

Matplotlib

Matplotlib 是用于绘制图形的库,使用Matplotlib可以轻松地绘制图形和实现数据的可 视化

 例子:

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()显示图形。 运行上述代码后,就会显示图1-3所示的图形。

追加cos函数图形并添加标题和x轴标签名的功能。

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()

显示图像

使用 matplotlib.image模块的imread()方法读入图像

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

这里,我们假定图像lena.png在当前目录下。读者根据自己的环境,可 能需要变更文件名或文件路径。另外,本书提供的源代码中,在dataset目 录下有样本图像lena.png。比如,在通过Python解释器从ch01目录运行上 述代码的情况下,将图像的路径'lena.png'改为'../dataset/lena.png',即 可正确运行 

  • 17
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值