Python基础

知识点目录:

操作文件和目录
Pillow基本操作
Matplotlib基本操作
Numpy
python知识点总结

··操作文件和目录··

操作文件和目录的函数一部分放在os模块中,一部分放在os.path模块中,这一点要注意一下。查看、创建和删除目录可以这么调用:

# 查看当前目录的绝对路径:
>>> os.path.abspath('.')
'/Users/michael'
#在某个目录下创建一个新目录,首先把新目录的完整路径表示出来:
>>> os.path.join('/Users/michael', 'testdir')
'/Users/michael/testdir'
# 然后创建一个目录:
>>> os.mkdir('/Users/michael/testdir')
# 删掉一个目录:
>>> os.rmdir('/Users/michael/testdir')

把两个路径合成一个时,不要直接拼字符串,而要通过os.path.join()函数,这样可以正确处理不同操作系统的路径分隔符。在Linux/Unix/Mac下,os.path.join()返回这样的字符串:

part-1/part-2

而Windows下会返回这样的字符串:

part-1\part-2

同样的道理,要拆分路径时,也不要直接去拆字符串,而要通过os.path.split()函数,这样可以把一个路径拆分为两部分,后一部分总是最后级别的目录或文件名:

>>> os.path.split('/Users/michael/testdir/file.txt')
('/Users/michael/testdir', 'file.txt')
os.path.splitext()可以直接让你得到文件扩展名,很多时候非常方便:

>>> os.path.splitext('/path/to/file.txt')
('/path/to/file', '.txt')

这些合并、拆分路径的函数并不要求目录和文件要真实存在,它们只对字符串进行操作。

文件操作使用下面的函数。假定当前目录下有一个test.txt文件:

# 对文件重命名:
>>> os.rename('test.txt', 'test.py')
# 删掉文件:
>>> os.remove('test.py')

但是复制文件的函数居然在os模块中不存在!原因是复制文件并非由操作系统提供的系统调用。理论上讲,我们通过上一节的读写文件可以完成文件复制,只不过要多写很多代码。

幸运的是shutil模块提供了copyfile()的函数,你还可以在shutil模块中找到很多实用函数,它们可以看做是os模块的补充。

最后看看如何利用Python的特性来过滤文件。比如我们要列出当前目录下的所有目录,只需要一行代码:

>>> [x for x in os.listdir('.') if os.path.isdir(x)]
['.lein', '.local', '.m2', '.npm', '.ssh', '.Trash', '.vim', 'Applications', 'Desktop', ...]
要列出所有的.py文件,也只需一行代码:

>>> [x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']
['apis.py', 'config.py', 'models.py', 'pymonitor.py', 'test_db.py', 'urls.py', 'wsgiapp.py']

是不是非常简洁?

小结

Python的os模块封装了操作系统的目录和文件操作,要注意这些函数有的在os模块中,有的在os.path模块中

··Pillow基本操作··

<font color=red size=5>官方文档
<font color=#6495ED size=5>1)使用 Image 类
详见Pillow文档_Image模块
要从文件加载图像,可以使用open( )函数,在Image模块中:

>>> from PIL import Image
>>> im = Image.open("E:/photoshop/1.jpg")

加载成功后,将返回一个Image对象,可以通过使用示例属性查看文件内容:

>>> print(im.format, im.size, im.mode)
('JPEG', (600, 351), 'RGB')

# format 这个属性标识了图像来源。如果图像不是从文件读取它的值就是None。size属性是一个二元tuple,包含width和height(宽度和高度,单位都是px)。 mode 属性定义了图像bands的数量和名称,以及像素类型和深度。常见的modes 有 “L” (luminance) 表示灰度图像, “RGB” 表示真彩色图像, and “CMYK” 表示出版图像。

>>> im.show()
>>> im.save('xxx.jpg'.'jpeg')#保存图像,第二个参数为文件格式,否则亿文件名扩展名作为格式保存。
补充:f,e = os.path.splittext(filename) 返回文件名、文件格式名

·图像的基本处理:

·图像的剪切、粘贴与合并操作

# crop, paste and merge
# PIL.Image.Image.crop 方法获取图像的一个子矩形选区

im = Image.open("E:/photoshop/lena.jpg")
box = (100,100,300,300)
region = im.crop(box)
region = region.transpose(Image.ROTATE_180)
im.paste(region, box)

·分离和合并颜色通道

r,g,b = im.split() #分别表示不同通道的单通道图像
im = Image.merge("RGB", (r,g,b))

·几何变换

out = im.resize((128,128))
out = im.rotate(45)  # degree conter-clockwise
#在Pillow中,对于一些常见的旋转作了专门的定义:
    out = im.transpose(Image.FLIP_LEFT_RIGHT)
    out = im.transpose(Image.FLIP_TOP_BOTTOM)
    out = im.transpose(Image.ROTATE_90)
    out = im.transpose(Image.ROTATE_180)
    out = im.transpose(Image.ROTATE_270)
    
·颜色空间变换

cmyk = im.convert("CMYK") #灰变彩
gray = im.convert("L")#彩变灰

<font color=#6495ED size=5><font color=#6495ED size=5>2)使用 ImageFilter 模块
详见Pillow文档_ImageFliter模块
可以通过filter( )函数使用,预定义滤波器包括:

BLUR、CONTOUR、DETAIL、EDGE_ENHANCE、EDGE_ENHANCE_MORE、EMBOSS、FIND_EDGES、SMOOTH、SMOOTH_MORE、SHARPEN。其中BLUR就是均值滤波,CONTOUR找轮廓,FIND_EDGES边缘检测,使用该模块时,需先导入,使用方法如下:

from PIL import ImageFilter
 
imgF = Image.open("E:/photoshop/lena.jpg")
outF = imgF.filter(ImageFilter.DETAIL)
conF = imgF.filter(ImageFilter.CONTOUR)
edgeF = imgF.filter(ImageFilter.FIND_EDGES)
imgF.show()
outF.show()
conF.show()
edgeF.show()

除此以外,ImageFilter模块还包括一些扩展性强的滤波器:

class PIL.ImageFilter.GaussianBlur(radius=2)

Gaussian blur filter.

<font color=#6495ED size=5>3)使用ImageEnhance模块
详见Pillow文档_ImageEnhance模块
可以调节图像的颜色、对比度和饱和度和锐化等:

from PIL import ImageEnhance
 
imgE = Image.open("E:/photoshop/lena.jpg")
imgEH = ImageEnhance.Contrast(imgE) 
imgEH.enhance(1.3).show("30% more contrast")

#调节对比度 An enhancement factor of 0.0 gives a solid grey image. A factor of 1.0 gives the original image.

··Matplotlib基本操作··

<font color=#6495ED size=5>1、快速绘图(pylab模块)

 -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 1000) # 返回均匀间隔的数字,第三个参数表示采样数量。
y = np.sin(x)
z = np.cos(x**2)

plt.figure(figsize=(8,4))#调用figure创建一个绘图对象,figsize参数可以指定绘图对象的宽度和高度。
plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)
plt.plot(x,z,"b--",label="$cos(x^2)$")

#plot函数的调用方式很灵活,第一句将x,y数组传递给plot之后,用关键字参数指定各种属性:
        label : 给所绘制的曲线一个名字,此名字在图示(legend)中显示。只要在字符串前后添加"$"符号matplotlib就会使用其内嵌的latex引擎绘制的数学公式。
        color : 指定曲线的颜色
        linewidth : 指定曲线的宽度
        
plt.xlabel("Time(s)")
plt.ylabel("Volt")
plt.title("PyPlot First Example")
plt.ylim(-1.2,1.2) #设置Y轴的范围
plt.legend()       #显示图示
plt.show()

绘制多轴图:
一个Figure对象可以包含多个子图(Axes),在matplotlib中用Axes对象表示一个绘图区域,称为子图,可以使用subplot()快速绘制包含多个子图的图表,它的调用形式如下:

subplot(numRows,numCols,plotNum) 

图表的整个绘图区域被等分为numRows行和numCols列,然后按照从左到下的顺序对每个区域进行编号,左上区域的编号为1。plotNum参数指定创建的Axes对象所在的区域 。

import numpy as np
import matplotlib.pyplot as plt
plt.figure(1) # 创建图表1
plt.figure(2) # 创建图表2
ax1 = plt.subplot(211) # 在图表2中创建子图1
ax2 = plt.subplot(212) # 在图表2中创建子图2
x = np.linspace(0, 3, 100)
for i in xrange(5):
    plt.figure(1)  #❶ # 选择图表1
    plt.plot(x, np.exp(i*x/3))
    #可以通过plt.sca()进行subplot的切换
    plt.sca(ax1)   #❷ # 选择图表2的子图1
    plt.plot(x, np.sin(i*x))
    plt.sca(ax2)  # 选择图表2的子图2
    plt.plot(x, np.cos(i*x))
plt.show()

<font color=#6495ED size=5>2、图像的处理

·显示图像

import matplotlib.pyplot as plt # plt 用于显示图片
import matplotlib.image as mpimg # mpimg 用于读取图片
import numpy as np

lena = mpimg.imread('lena.png') # 读取和代码处于同一目录下的 lena.png
# 此时 lena 就已经是一个 np.array 了,可以对它进行任意处理
lena.shape #(512, 512, 3)

·显示某个通道

# 显示图片的第一个通道
lena_1 = lena[:,:,0]
plt.imshow('lena_1')
plt.show()
# 此时会发现显示的是热量图,不是我们预想的灰度图,可以添加 cmap 参数,有如下几种添加方法:
plt.imshow('lena_1', cmap='Greys_r')

img = plt.imshow('lena_1')
img.set_cmap('gray') # 'hot' 是热量图

plt.axis('off')
plt.show()

·图像放缩

from scipy import misc
lena_new_sz = misc.imresize(lena, 0.5) # 第二个参数如果是整数,则为百分比,如果是tuple,则为输出图像的尺寸
plt.imshow(lena_new_sz)
plt.axis('off')
plt.savefig('lena_new_sz.png') 
#保存图像,或将array保存为图像:
    from scipy import misc
    misc.imsave('lena_new_sz.png', lena_new_sz)

plt.show()

··Numpy··

<font color=gray size=6>random模块

import numpy as np
import numpy.random as random

# 设置随机数种子
random.seed(42)

# 产生一个1x3,[0,1)之间的浮点型随机数,例array([[ 0.37454012,  0.95071431,  0.73199394]])
random.rand(1, 3)

# 产生一个[0,1)之间的浮点型随机数
random.random()

# 下边4个没有区别,都是按照指定大小产生[0,1)之间的浮点型随机数array,不Pythonic…
random.random((3, 3))
random.sample((3, 3))
random.random_sample((3, 3))
random.ranf((3, 3))

# 产生10个[1,6)之间的浮点型随机数
random.uniform(1, 6, 10)

# 产生10个[1,6]之间的整型随机数
random.randint(1, 6, 10)

# 产生2x5的标准正态分布样本
random.normal(size=(5, 2))

# 产生5个,n=5,p=0.5的二项分布样本
random.binomial(n=5, p=0.5, size=5)

#返回array([0,1, 2, 3, 4]),range(5)返回一个list: [0,1, 2, 3, 4]
a = np.arange(5) #可以以浮点型作为间隔:np.arange(1,5,.5)

# 从a中有回放的随机采样7个
random.choice(a, 7)

# 从a中无回放的随机采样7个
random.choice(a, 7, replace=False)

# 对a进行乱序并返回一个新的array
b = random.permutation(a)

# 对a进行in-place乱序
random.shuffle(a)

# 生成一个长度为9的随机bytes序列并作为str返回
# '\x96\x9d\xd1?\xe6\x18\xbb\x9a\xec'
random.bytes(9)

<font color=gray size=6>array模块

ndarray(下文统一称之为数组)是存储单一数据类型的多维数组,表示是数组对象类型 《class 'numpy.ndarray'》
<font color=#6495ED size=5>·ndarray对象重要属性:

ndarray.ndim 返回一个number,维度,axes数,rank值
ndarray.shape 返回一个tuple,表示形状,如(2,3)表示2x3,(3,3,3)表示3x3x3
ndarray.size 返回一个number,表示ndarray中所有元素的个数,等价于shape中各个元素的乘积
ndarray.dtype 返回一个dtype对象,表示ndarray中元素的类型

<font color=#6495ED size=5>创建矩阵(采用ndarray对象)

ndarray.array(seq[, dtype='']) 参数必须为sequence, 这个seq可以是单一的seq也可以是seq的seq的seq...,对应着产生几维的array。也可以同时指定元素类型。

>>> b = np.array([1.2, 3.5, 5.1])      #seq
>>> b.dtypedtype('float64')
>>> b = np.array([(1.5,2,3), (4,5,6)])    #seq of seq

有时候不知道数组的元素,却知道数组的shape,这时可以通过以下三种方法生产数组

zeros(tuple, dtype) : np.zeros( (3,4) ),3x4全零数组
ones(tuple, dtype) : np.ones( (2,3,4), dtype=np.int16 ),2x3x4全1数组
empty(tuple):        np.empty( (2,3) ),随机数组
eye(a):              np.eye(3),创建3阶单位矩阵

<font color=#6495ED size=5>·基本操作:

np.asarray(a, dtype=None, order=None) 
#将a转换成数组,返回ndarray对象。a可以是list、tuple,也可以转换数据类型。

np.hstack([a1,a2] = np.concatenate( (a1,a2), axis=1 )
#横向合并
np.vstack((a1,a2) = np.concatenate( (a1,a2), axis=0 )
#纵向合并

<font color=gray size=6>常见函数笔记

<font color=#6495ED size=5>·numpy.expand_dims

numpy.expand_dims(a, axis) #Expand the shape of an array.
    例:x = np.array([1,2]),shape=(2,)
    axis = 0 :按列扩充,返回array([[1,2]]),shape=(1,2)
    axis = 1 : 按行扩充,返回array([1],
                                  [2]),shape=(2,1)

<font color=#6495ED size=5>·numpy.concatenate

numpy.concatenate((a1, a2, ...), axis=0) #Join a sequence of arrays along an existing axis.
    Parameters: a1, a2, ... : sequence of array_like
                axis : int, optional
    Returns:    ndarray #The concatenated array.
例:
>>> a = np.array([[1, 2], [3, 4]])
>>> b = np.array([[5, 6]])
>>> np.concatenate((a, b), axis=0)
array([[1, 2],
       [3, 4],
       [5, 6]])
>>> np.concatenate((a, b.T), axis=1)
array([[1, 2, 5],
       [3, 4, 6]])

··python知识点总结··

<font color=#6495ED size=5>·二维字典:

Python 中的dict可以实现迅速查找。那么有没有像数组有二维数组一样,有二维的字典呢?比如我需要对两个关键词进行查找的时候。2D dict 的建立:

dict_2d = {'a': {'a': 1, 'b': 3}, 'b': {'a': 6}}

通过 dict_2d['a']['b']来访问。但是添加一个新的 “key-value”对却比较复杂。对一维字典,可以用

dict_1d = dict()
dict_1d['a'] = 1

或者 dict_1d.update({'a': 1})

但是”2-D” dictionary 新添一个”key-value”对时,不能简单的用以下形式

dict_2d['a']['c'] = 8

因为二维字典的两层key和value之间会混淆,需要判断第一个key是否已经存在了。添加二维的字典可以通过一个函数来简单实现:

def addtwodimdict(thedict, key_a, key_b, val): 
    if key_a in adic:
        thedict[key_a].update({key_b: val})
    else:
        thedict.update({key_a:{key_b: val}})

比如可以用作查找城市之间的距离

mapdict = dict()

addtwodimdict(mapdict, 'Beijing', 'Guangzhou', 1897)
addtwodimdict(mapdict, 'Chengdu', 'Guangzhou', 1243)
addtwodimdict(mapdict, 'Guangzhou', 'Shanghai', 1212)
addtwodimdict(mapdict, 'Beijing', 'Chengdu', 1516)
addtwodimdict(mapdict, 'Chengdu', 'Shanghai', 1657)
addtwodimdict(mapdict, 'Beijing', 'Shanghai', 1075)

print  'The distance between Chengdu and Guangzhou is ',mapdict['Chengdu']['Guangzhou']

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容

  • 来源:NumPy Tutorial - TutorialsPoint 译者:飞龙 协议:CC BY-NC-SA 4...
    布客飞龙阅读 32,720评论 6 96
  • Python基础类型: Tuple元组,内容不可改变,但是允许元素内部存在list等类型的元素,并且允许改变列表的...
    bitsman阅读 705评论 0 0
  • 输入 readline() 输入:abc输出:4原因:readline()会将标准输入的内容全部获取,包含最后的换...
    NapoleonY阅读 814评论 0 0
  • python 随笔 关键字 基础 内建函数 技巧 模块 进阶
    泰_然阅读 523评论 0 1
  • 1 简介 UIScrollView 是负责滚动的视图。苹果最强大的地方就在于其良好的UI展示,和UE体验。如果不会...
    非典型技术宅阅读 1,060评论 0 8