面向对象最重要的概念就是类(class)和实例(instance),类是抽象的模板,实例是根据类创建出来的一个个具体的“对象”。每一个对象都从类中集成有形同的方法,但各自的数据可能不同。
class Student(object):
pass
#表示Student类从object类继承下来的,其中Object类是所有类都会继承的类。
student = Student()
#定义好了类可以通过Student类创建出Student的实例,创建实例通过类名+()实现。
python内置的方法__init__方法,用于在创建实例的时候,把我们认为必须绑定的属性强制填写进去。
Class Student(object):
def __init__(self,name,score):
self.name = name
self.score = score
__init__方法的第一个参数永远是self,表示创建的类实例本身,self只想创建的实例本身
有了__init__方法,创建实例的时候就不可以不传参数了,必须传入与__init__方法匹配的参数,但self不用传参数。
类比java理解__init__:
class Student(object):
def __init__(self, name, score):
self.__name = name
self.__score = score
def print_score(self):
print "%s: %s" %(self.__name,self.__score)
>>> student = Student('Hugh', 99)
>>> student.__name
Traceback (most recent call last):
File "" , line 1, in <module>
AttributeError: 'Student' object has no attribute '__name'
class Parent:
def pprt(self):
print(self)
class Child(Parent):
def cprt(self):
print(self)
c = Child()
c.cprt()
#输出:<__main__.Child object at 0x0000000002A47080>
c.pprt()
#输出:<__main__.Child object at 0x0000000002A47080>
#运行c.cprt等价于Child.cprt(c),self指的依然是Child类的实例。
p = Parent()
p.pprt()
#输出:<__main__.Parent object at 0x0000000002A47240>
介绍python类和实例
解释:
所有函数都是可调用对象。
一个类实例可以变成一个可调用对象,只需要实现一个特殊方法__call__()
案例:
class F:
def __call__(self, *args, **kwargs):
print('执行__call__')
说明:
s = F()
s()
先给类创建一个对象,直接通过对象来执行,就会自动去执行类中的__call__函数。
python,是一门动态语言,也就是可以给对象动态添加属性和方法。
python,属于脚本语言,不像编译型语言那样先将程序编译成二进制再运行,而是动态的逐行解释运行。
一个python源码文件(.py),不仅可以直接运行,还可以作为模块被其他文件调用。
*self:表示类的实例,而不是类。
*在python中,类的方法与普通函数的一个特别的区别是:
他们必须有一个额外的第一个参数名称,但是在调用这个方法的时候你不为这个参数赋值,python会提供这个值。这个特别的变量指对象本身,按照惯例它的名称是self。也就是说如果这个函数是类的方法,则第一个参数就是self。
参数axis=0/1,0在列中比较,选出最大的行索引,1在行中比较,选出最大的列索引。
二维数组中最后一位axis=1和axis=-1是一样的。
参考
import numpy as np
from PIL import Image
size—以像素为单位的请求大小,二元组(宽度、高度)
resample—可选的重新采样过滤器
参考
参数keepends,表示输出是否保留换行符(‘\r’,‘\r\n’,‘\n’),默认是false,不包含换行符,如果为true,则保留换行符。
os.path模块主要用于文件的属性获取。
参数:path需要递归创建的目录。
mode权限设置。
参考
参考
if __name__ == '__main__':
#当.py文件被直接运行时,if __name__ == '__main__'则 该内容之后的代码块将被运行;
#当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行。
参数:
shape:int或ints序列,如【2,(2,3)】,新数组的形状;
dtype:数组类型,可选numpy.int8,默认是numpy.float64;
order:{‘C’,‘F’},可选,是否在存储器中以C或Fortran(按行或列方式)连续存储多维数据。
sequence:要连接的元素序列。
解释:range(x)——range(0,x)
参考
x是矩阵或者数组。
x.flatten(‘F’)——表示按列排序
基本语法是通过{}和:来替代以前的%
参考
每一个bin都是给出输入数组中每个数出现的次数。如果有加权的w值,输出是out[n]+=weight[i],而不是out[n]+=1
x:输入数组;weights:加权,和x的shape一致;minlength:输出矩阵bin数的最小值。
output:输出矩阵分bin的结果,数组。
参考
type可选值:int32、float64、string_
参考
参考
NaN : Not a Number(NaN),代表一个“不是数字”的值,这个值不能直接进行计算,但它却是一个Number类型。
参考
number:要进行四舍五入的数;digits:要小数点后保留的位数。
参考
array是一维数组,结果形成一个以一维数组为对角线元素的矩阵
array是二维数组,结果输出矩阵的对角线元素
参考
x:一般是数组;y:是一个数
返回值:不固定。
参考
axis=0:每一列元素进行相加
axis=1:每一行元素进行相加
无参数:对array的全部元素进行相加
作用:空语句。保证格式完整。保证语义完整。
作用:通过指定分割符对字符串进行切片,返回分割后的字符串列表。
参数:
str——分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等;
num——分割次数;
作用:用于命名文件或目录,从src到dst,如果dst是一个存在的目录,将抛出OSError
参数:
src:要修改的目录名
dst:修改后的目录名
参考
argparse模块,用于处理命令行选项、参数和子命令解析器等相关内容。
此模块可以让人快速编写用户友好的命令行接口内容。
程序定义它需要的参数,然后 argparse 将弄清如何从 sys.argv 解析出那些参数。 argparse 模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息。
提供了简单易用的参数配置方法,提供在命令行程序中进行使用。
argparse的三个主要步骤:
1.创建ArgumentParser()对象
2.调用add_argument()方法添加参数
3.使用parse_args()解析添加的参数
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
# name/flage:一个命名或者一个选项字符串的列表
# type :命令行参数应当被转换成的类型
# default:当参数未在命令行中出现时使用的值
# help:一个此选项作用的简单描述
import argparse
if __name__ == '__main__':
# 第1步:创建ArgumentParser对象
parser = argparse.ArgumentParser(
usage='这是一个测试usage.',
description='这是一大段描述文本。',
add_help='这是帮忙')
# 第2步:添加变量
parser.add_argument('-nmap', type=str, help='扫描文件路径')
parser.add_argument('-pocs', type=str, default='pocs.json', help='模板文件路径')
parser.add_argument('-n', type=int, default=-1, help='行数')
parser.add_argument('-o', type=str, default=-1, help='输出文件路径。')
# 第3步:解析输入变量
args = parser.parse_args()
# 第4步:使用变量
print(parser.prog)
print(args.nmap)
print(args.pocs)
print(args.n)
print(args.o)
参考
glob模块主要用来查找目录和文件。
作用:返回匹配到的路径列表
参数:
pathname:要匹配的路径
recursive:如果是true就会递归的去匹配符合的文件路径,默认是False
pathname中可以使用通配符:*,?,[]
*代表0个或多个字符
?代表一个字符
[]匹配指定范围内的字符,如[0-9]匹配字符
备注:通过glob.glob匹配的路径,最后一个文件的分隔符是\。
dataroot = "./Train_NG"
print(dataroot)
name = []
for x in glob.glob(dataroot + '/*'):
print(x)
#输出显示
#./Train_NG
#./Train_NG\kos01_Part5_label.bmp
参考
作用:判断某一路径path是否为目录。
作用:用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
参数:
sequence : 一个序列、迭代器或其他支持迭代对象。
start :下标起始位置。
返回值:返回 enumerate(枚举) 对象。
>>>seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>>list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>>list(enumerate(seasons, start=1)) # 小标从 1 开始
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
作用:打印进度条
参考
参考
文件名开头为n的,如果使用’/'分隔符会被转意。为了防止被转意,需要在字符串前面增加一个r。
在windows系统中,路径层级的分隔符为’ \ ’
在Linux系统中,路径层级的分隔符为’ / ’
但是python 对分隔符做了兼容,让Linux风格路径在windows下可用,于是很多时候大家都会选Linux风格。
作用:用于打开一个文件,模式参数mode参数是可选的,默认为 0777。
参数:(file)要打开的文件;
返回值:一个文件对象,可迭代。
参考
注意:文件使用完毕之后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的。也就是文件.close()
每次都这么写实在太繁琐,所以,Python引入了with语句来自动帮我们调用close()方法:
with open('/path/to/file', 'r') as f:
print(f.read())
作用:从序列seq中选择n个随机且独立的元素。
参考
image = cv2.imread("path")
print(image)
像素分布在[0,255]之间
print(image.shape)
输出内容是:高、宽、通道数
print(type(image))
<class 'numpy.ndarray>,支持的格式是numpy格式
print(image.dtype)
uint8,数据类型是uint8
tensor | opencv | |
---|---|---|
像素分布 | float32 | [0,255] uint8 |
图像数据类型 | Tensor | numpy类型 |
size/shape | 通道/高/宽 | 高/宽/通道数 |
方法 | 作用 |
---|---|
os.remove() | 删除一个文件 |
os.mknod(文件名) | 创建空文件 |
os.listdir(path) | 返回指定路径下的文件和文件夹列表 |
参考
作用:计算混淆矩阵以及评估分类的准确性。
解释:定义混淆矩阵C(confusion matrix C),Cij表示样本本身在i分组内但是预测却在j分组的数量。
参数:
y_true:样本的真实分类结果(数组类的形状)
y_pred:样本预测分类的结果(数组类的形状)
labels:索引矩阵的标签列表(数组类的形状)
sample_weight:样本权重
返回值:ndarray的形状。
from sklearn.metrics import confusion_matrix
y_true = [2, 1, 0, 1, 2, 0]
y_pred = [2, 0, 0, 1, 2, 1]
C=confusion_matrix(y_true, y_pred)
print(C, end='\n\n')
y_true = ["cat", "ant", "cat", "cat", "ant", "bird"]
y_pred = ["ant", "ant", "cat", "cat", "ant", "cat"]
C2 = confusion_matrix(y_true, y_pred, labels=["ant", "bird", "cat"])
print(C2)
作用:返回压缩为一维的数组的副本。只适用于numpy对象,即array或者mat,普通的list列表是不行的。
参数:
order(C——按行进行压缩;F——按列进行压缩)
from numpy import *
a = array([[1,2],[3,4],[5,6]])
print(a)
结果:
[[1 2]
[3 4]
[5 6]]
print(a.flatten('F'))
结果:
[1 3 5 2 4 6]
print(a.flatten('C'))
结果:
[1 2 3 4 5 6]
作用:以一维数组的形式返回方阵的对角线(或非对角线)元素,或将一维数组转换成方阵(非对角线元素为0).两种功能角色转变取决于输入的v。
参数:
v:如果v是2D数组,返回k位置的对角线。如果v是1D数组,返回一个v作为k位置对角线的2维数组。
k:(int optional):对角线的位置,大于零位于对角线上面,小于零则在下面。
>>> x = np.arange(9).reshape((3,3))
>>> x
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> np.diag(x)
array([0, 4, 8])
>>> np.diag(x, k=1)
array([1, 5])
>>> np.diag(x, k=-1)
array([3, 7])
>>> np.diag(np.diag(x))
array([[0, 0, 0],
[0, 4, 0],
[0, 0, 8]])
介绍:Nadrray是N维数组对象,是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引,是NumPy 最重要的一个特点之一。
注意点:
ndarray 对象是用于存放同类型元素的多维数组。
ndarray 中的每个元素在内存中都有相同存储大小的区域。
内部组成:
参考
作用:计数每个值在非负整数数组中的出现次数。
容器的数量(大小为1)比x中的最大值大1。解释:相当于x给出的是索引值,此函数用于统计索引值的出现的次数,因为索引范围是0-n则不同索引值组成的列表的长度就是n+1.
参数:
x:类似数组,一维,且是非负整数。
minlength:整型,可选,表示输出数组的最小的bins个数。
作用:
array.dtype()——判断数组内部数据类型;
array.astype(类型)——可以对数组数据类型进行转换;
plt.plot()
#单条线:
plot([x], y, [fmt], data=None, **kwargs)
#多条线一起画
plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)
[fmt] 是一个字符串来定义图的基本属性如:颜色(color),点型(marker),线型(linestyle),
plot
plt.legend()
图例,为了帮助我们展示每个数据对应的图像名称。
不带参数调用 legend 会自动获取图例句柄及相关标签
legend
操作 | opencv | PIL.Image |
---|---|---|
图片读取模式 | BGR模式 | RGB模式 |
读取图片 | cv2.imread,输出的内容是[[][][]],类型是ndarray类型 | Image.open只是保持了图像被读取的状态,输出内容是 |
图片存储 | cv2.imwrite保存图像 | Image.save针对于保存JPG/JPEG格式的图片的情况 |
作用:绘制点和线,并对其样式进行控制。
参考
opencv方式 | |
---|---|
读取图片 | cv2.imread |
展示图片 | cv2.imshow 采用BGR模式 |
matplotlib.pyplot方式 | |
读取 | plt.imread |
展示 | plt.imshow 采用RGB模式 |
PIL.Image方式 | |
读取 | Image.open |
展示 | 图片.show 采用RGB模式 |
class IOU(torch.nn.Module):
def __init__(self, size_average = True):
super(IOU, self).__init__()
self.size_average = size_average
def forward(self, pred, target):
return _iou(pred, target, self.size_average)
Class类
Class:是一个面向对象的类,用来描述具有相同的属性和方法的对象的集合,类可以起到模板的作用;
在创建实例的时候,可以将认为必要的属性写入方法__init__中。
使用的时候需要进行实例化;
self:表示创建实例本身,所以可以把各种属性绑定到self;
def
类class中的def被称为函数,模板中可以包含很多函数;
使用的时候不需要实例化;
作用:
用于替换字符串中的匹配项
语法:
re.sub(pattern, repl, string, count=0, flags=0)
参数名 | 介绍 |
---|---|
pattern | 正则中的模式字符串 |
repl | 替换的字符串,也可为一个函数 |
string | 要被查找替换的原始字符串 |
count | 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配 |
flags | 编译时用的匹配模式,数字形式 |
作用:接收一个函数 f 和 一个list,并通过把函数f依次作用在list的每个元素上,得到一个迭代器并返回。
python2中返回的是一个list,python3中返回的是一个iterator。
a = 1234
lis = list(map(int, str(a)))
print(lis) #输出:[1, 2, 3, 4] 每个元素都是int类型
作用:将任何可迭代数据转换为列表类型,并返回转换后的列表。
当参数为空的时候,list函数可以创建一个空列表;
可以将range类型和map类型的可迭代序列转换为列表;