在学习的过程中我也翻阅了一些书籍,最近在看《深度学习之pytorch实战计算机视觉》,记录一下笔记。这篇笔记主要是第5章的内容,介绍一些python中的类,以及常用的库Numpy和Matplotlib。
目录
5.3.8 Python中的类
python是面向对象的程序语言。
1.类的创建
- (1) 类变量:在创建的类中会定义一些变量,我们把这些变量叫作类变量,类变量的值在这个类的所有实例之间是共享的,同时内部类或者外部类也能对这个变量的值进行访问。
- (2) __init__():是类的初始化方法,我们在创建一个类的实例时就会调用一次这个方法。
- (3) self :代表类的实例,在定义类的方法时是必须要有的,但是在调用时不必传入参数。
看一下例子。
class Student:
student_Count = 0
def __init__(self,name,age):
self.name = name
self.age = age
Student.student_Count += 1
def dis_student(self):
print("Student name:",self.name,"Student age:",self.age)
#创建对象
student1 = Student("TANG","20")
student2 = Student("WU","22")
student1.dis_student()
student2.dis_student()
print("Total Student:",Student.student_Count)
输出结果:
Student name: TANG Student age: 20
Student name: WU Student age: 22
Total Student: 2
2.类的继承
我们可以将继承理解为:定义一个类,通过继承获得另一个类的所有方法,被继承的类叫作父类,进行继承的类叫作子类,这样可以有效地解决代码的重用问题,在提升了代码的效率和利用率的基础上还增加了可扩展性。
不过需要注意的是,当一个类被继承时,这个类中的初始化方法是不会被自动调用的,所以我们需要在子类中重新定义类的初始化方法。
另外,我们在使用 Python 代码去调用某个方法时,默认会先在所在类中进行查找,如果没有找到,则判断所在的类是否为子类,若为子类,就继续到父类中查找。下面通过一个具体的实例来看看如何创建和使用子类。
class People():
def __init__ (self,name,age):
self.name= name
self.age= age
def dis_name(self):
print ("name is :", self.name)
def set_age(self, age):
self.age = age
def dis_age(self):
print ("age is: ", self.age)
class Student(People):
def __init__(self,name,age,school_name):
# People.__init__(self,name,age)
# super(Student,self).__init__(self,name,age,school_name)
self.name=name
self.age=age
self.school_name=school_name
def dis_student(self):
print("school name is:",self.school_name)
stu = Student("Wu","20","GLDZ")
stu.dis_student()#调用子类的方法
stu.dis_name()#调用父类的方法
stu.dis_age() #调用父类的方法
stu.set_age(22) #调用父类的方法
stu.dis_age() #调用父类的方法
输出:
school name is: GLDZ
name is : Wu
age is: 20
age is: 22
或者
class People():
def __init__(self,name,age):
self.name = name
self.age = age
def dis_name(self):
print ("name is :", self.name)
def set_age(self, age):
self.age = age
def dis_age(self):
print ("age is: ", self.age)
class Student(People):
def __init__(self,name,age):
#super().__init__(self,restaurant_name,cuisine_type)
super().__init__(name,age)
self.school_name="abc"
def dis_student(self):
print("school name is:",self.school_name)
stu = Student("Wu","20")
stu.dis_name()
stu.dis_age()
stu.dis_student()
输出:
name is : Wu
age is: 20
school name is: abc
再看一个例子:
class Father(object):
def __init__(self, name):
self.name=name
print ( "name: %s" %( self.name) )
def getName(self):
return 'Father ' + self.name
class Son(Father):
def __init__(self, name,age):
print ( "hi" )
self.name = name
self.age = age
def getName(self):
return 'Son '+ self.name + " is " + self.age
if __name__=='__main__':
son=Son('runoob','20')
print ( son.getName() )
输出:
hi
Son runoob is 20
3. 类的重写
在继承一个类后,父类中的很多方法也许就不能满足我们现有的需求了,这时我们就要对类进行重写。下面通过一个实例来看看如何对类中的内容进行重写。
#定义父类
class Parent:
def __init__(self):
pass
def print_info(self):
print("This is Parent.")
#定义子类
class Child(Parent):
def __init__(self):
pass
#重写父类的方法
def print_info(self):
print("This is Child.")
child = Child()
child.print_info()#This is Child.
5.4 Python中的Numpy
5.4.1 安装
pip install numpy
5.4.2 多维数组
1.创建多维数组
常用的方法是array。
import numpy as np
np.array([1,2,3])
np.array([[1,2,3],[4,5,6]])
(1)使用 NumPy 中的 ones 可以创建维度指定且元素全为1的数组。
(2)使用 NumPy 中的 zeros 可以创建维度指定且元素全为0的数组。
(3)使用 NumPy 中的 empty 可以创建维度指定且元素全为随机数的数组。
2.多维数组的常用属性
- (1) ndim:返回统计的数组维数,即维度的数量。
- (2) shape:返回数组的维度值,对返回的结果使用数据类型为整型的元组来表示,比如维数组返回的结果为(n,m),那么 表示数组中对应维度数据的长度。
- (3) size:返回要统计数组中的元素的总数量。
- (4) dtype:返回数组中元素的数据类型。
- (5) itemsize:返回数组中每个元素的字节大小。例如元素的dtype是float64,则为8=64/8;元素的dtype是complex32,则为4=32/8,其他类似。
import numpy as np
a = np.empty([3,3])
a.dim #2
a.shape #(3,3)
a.size #9
a.dtype #dtype('float64')
a.itemsize #8
3.数组的打印
在数组中的元素太多时,若全部进行打印输出,则会占用大面积的显示空间,而且不易查看,所以在打印输出元素过多的数组时,输出显示的内容会自动跳过中间的部分,只打印首尾的一小部分,对中间的部分用省略号(...)来代替。
b = np.arange(2000)
print(b) #[ 0 1 2 ... 1997 1998 1999]
5.4.3 多维数组的基本操作
这些操作包括数组的算术运算、索引、切片、迭代等。
1.数组的算术运算
加法、减法、乘法和除法,分别为+、-、*和/。
2.数组自身的运算
- (1) min:默认找出数组的所有元素中值最小的元素,可以通过设置axis值来按行(axis=1)或者列(axis=0)查找元素中的最小值。
- (2) max:默认找出数组的所有元素中值最大的元素,可以通过设置 axis的值来按行或者列查找元素中的最大值。
- (3) sum:默认对数组中的所有元素进行求和运算,并返回运算结果,同样可以通过axis的值来按行或者列对元素进行求和运算。
- (4) exp:对数组中的所有元素进行指数运算。
- (5) sqrt:对数组中的所有元素进行平方根运算。
- (6) square:对数组中的所有元素进行平方运算。
3.随机数组
生成随机数在我们平时的应用中是很有用的,有很多方法:
- (1) seed:随机因子,在随机数生成器的随机因子被确定后,无论我们运行多少次随机程序,最后生成的数字都是一样的,随机因子更像把随机的过程变成一种伪随机的机制,不过这有利于结果的复现。
- (2) rand:生成一个在[0, 1)范围内满足均匀分布的随机样本数。
- (3) randn:生成一个满足平均值为0且方差为1的正太分布随机样本数。
- (4) randint:在给定的范围内生成类型为整数的随机样本数。
- (5) binomial:生成一个维度指定且满足二项分布的随机样本数。
- (6) beta:生成一个指定维度且满足 beta 分布的随机样本数。
- (7) normal:生成一个指定维度且满足高斯正太分布的随机样本数。
np.random.seed(42)
print(np.random.rand(2,3))
print(np.random.randn(2,3))
print(np.random.randint(1,10))
print(np.random.binomial(6,1))
print(np.random.beta(2,3))
print(np.random.normal(2,3))
输出:
[[0.37454012 0.95071431 0.73199394]
[0.59865848 0.15601864 0.15599452]]
[[ 1.57921282 0.76743473 -0.46947439]
[ 0.54256004 -0.46341769 -0.46572975]]
6
6
0.45543839870822056
2.666236704694229
5.5 Python中的Matplotlib
Matplotlib是Python的绘图库。
5.5.1 Matplotlib的安装
pip install Matplotlib
5.5.2 创建图
1.线型图
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.randn(30)
plt.plot(x,"r--o")
输出图像:
2.线条颜色、标记形状和线型
用于设置线型图中线条颜色的常用参数如下:
用于设置线型图中标记参数点形状的常用参数如下:
用于设置线型图中连接参数点线条形状的常用参数如下:
3.标签和图例
我们可以增加一些绘制图像的说明,一般是添加图像的轴标签和图例。看一个例子。
np.random.seed(42)
x = np.random.randn(30)
y = np.random.randn(30)
plt.title("Example")
plt.xlabel("X")
plt.ylabel("Y")
X, = plt.plot(x,"r--o")
Y, = plt.plot(y,"b-*")
plt.legend([X,Y],["X","Y"])
输出内容如下:
4.子图(Subplot)
可以将多个图像同时在不同的位置显示。代码如下:
a = np.random.randn(30)
b = np.random.randn(30)
c = np.random.randn(30)
d = np.random.randn(30)
fig = plt.figure() #首先定义一个实例
#添加子图
ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,2)
ax3 = fig.add_subplot(2,2,3)
ax4 = fig.add_subplot(2,2,4)
A, = ax1.plot(a,"r--o")
ax1.legend([A],["A"])
B, = ax2.plot(b,"b-*")
ax2.legend([B],["B"])
C, = ax3.plot(c,"g-.+")
ax3.legend([C],["C"])
D, = ax4.plot(d,"m:x")
ax4.legend([D],["D"])
输出图像:
除了绘制线型图,Matplotlib还能绘制散点图、直方图和饼图等。
5.散点图(Scatter)
如果有一批散点数据,绘制散点图能更清晰地展示所有数据的分布和布局。
np.random.seed(42)
x = np.random.randn(30)
y = np.random.randn(30)
plt.scatter(x,y,c="g",marker="o",label="(X,Y)")
plt.title("Example")
plt.xlabel("X")
plt.ylabel("Y")
plt.legend(loc = 1)
plt.show()
图像输出如下:
上述的核心代码为:plt.scatter(x,y,c="g",marker="o",label="(X,Y)"),其中有三个需要注意的参数:
- c:图中的点使用哪种颜色(参考线型图)
- marker:图中的点使用哪种形状(参考线型图)
- label:图中的点使用的图例,与线型图不同。
通过plt.legend(loc=1)对图例的位置进行设定,一般采用这几种:
- loc=0:图例使用最好的位置。
- loc=1:图中右上角
- loc=2:图中左上角
- loc=3:图中左下角
- loc=4:图中右下角
6.直方图
直方图(Histogram)又称质量分布图,是一种统计报告图,通过使用一系列高度不等的纵向条纹或直方表示数据分布的情况,一般用横轴表示数据类型,用纵轴表示分布情况,下面看具体的实例。
np.random.seed(42)
x = np.random.randn(100)
plt.hist(x,bins=20,color='g')#bins指定直方图条纹的数量
plt.title("Example")
plt.xlabel("X")
plt.ylabel("Y")
plt.show()
输出图像:
7.饼图
饼图用于显示一个数据系列(理解为一类数据),而每个数据系列都应当拥有自己唯一的颜色。在同一个饼图中可以绘制多个系列的数据,并根据每个系列的数据量的不同来分配它们在饼图中的占比。代码如下:
import matplotlib.pyplot as plt
import numpy as np
labels = ['dog','cat','bird']
sizes = [15,50,35]
plt.pie(sizes,explode=(0,0,0.1),labels= labels,autopct='%1.1f%%',startangle = 90)
plt.axis('equal')#必须有,保证x轴和y轴刻度一致,得到的饼图是圆形
plt.show()
图像如下:
核心代码为plt.pie(sizes,explode=(0,0,0.1),labels= labels,autopct='%1.1f%%',startangle = 90),其中几个参数理解为:
- sizes:三个数字确定每部分数据系列在整个圆形中的占比
- explode=(0,0,0.1):定义每部分数据系列之间的间隔,这里突出第3部分
- autopct:将sizes中的数据以所定义的浮点精度进行显示
- startangle:绘制第1块饼图与X轴正方向的夹角,这里为90,默认为0
plt.axis('equal')是必须有的,用于保证x轴和y轴刻度一致,最后得到的饼图才是圆形。
说明:记录学习笔记,如果错误欢迎指正!写文章不易,转载请联系我。