Python基礎(chǔ)

知識(shí)點(diǎn)目錄:

操作文件和目錄
Pillow基本操作
Matplotlib基本操作
Numpy
python知識(shí)點(diǎn)總結(jié)

··操作文件和目錄··

操作文件和目錄的函數(shù)一部分放在os模塊中,一部分放在os.path模塊中,這一點(diǎn)要注意一下。查看、創(chuàng)建和刪除目錄可以這么調(diào)用:

# 查看當(dāng)前目錄的絕對(duì)路徑:
>>> os.path.abspath('.')
'/Users/michael'
#在某個(gè)目錄下創(chuàng)建一個(gè)新目錄,首先把新目錄的完整路徑表示出來(lái):
>>> os.path.join('/Users/michael', 'testdir')
'/Users/michael/testdir'
# 然后創(chuàng)建一個(gè)目錄:
>>> os.mkdir('/Users/michael/testdir')
# 刪掉一個(gè)目錄:
>>> os.rmdir('/Users/michael/testdir')

把兩個(gè)路徑合成一個(gè)時(shí),不要直接拼字符串,而要通過(guò)os.path.join()函數(shù),這樣可以正確處理不同操作系統(tǒng)的路徑分隔符。在Linux/Unix/Mac下,os.path.join()返回這樣的字符串:

part-1/part-2

而Windows下會(huì)返回這樣的字符串:

part-1\part-2

同樣的道理,要拆分路徑時(shí),也不要直接去拆字符串,而要通過(guò)os.path.split()函數(shù),這樣可以把一個(gè)路徑拆分為兩部分,后一部分總是最后級(jí)別的目錄或文件名:

>>> os.path.split('/Users/michael/testdir/file.txt')
('/Users/michael/testdir', 'file.txt')
os.path.splitext()可以直接讓你得到文件擴(kuò)展名,很多時(shí)候非常方便:

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

這些合并、拆分路徑的函數(shù)并不要求目錄和文件要真實(shí)存在,它們只對(duì)字符串進(jìn)行操作。

文件操作使用下面的函數(shù)。假定當(dāng)前目錄下有一個(gè)test.txt文件:

# 對(duì)文件重命名:
>>> os.rename('test.txt', 'test.py')
# 刪掉文件:
>>> os.remove('test.py')

但是復(fù)制文件的函數(shù)居然在os模塊中不存在!原因是復(fù)制文件并非由操作系統(tǒng)提供的系統(tǒng)調(diào)用。理論上講,我們通過(guò)上一節(jié)的讀寫(xiě)文件可以完成文件復(fù)制,只不過(guò)要多寫(xiě)很多代碼。

幸運(yùn)的是shutil模塊提供了copyfile()的函數(shù),你還可以在shutil模塊中找到很多實(shí)用函數(shù),它們可以看做是os模塊的補(bǔ)充。

最后看看如何利用Python的特性來(lái)過(guò)濾文件。比如我們要列出當(dāng)前目錄下的所有目錄,只需要一行代碼:

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

是不是非常簡(jiǎn)潔?

小結(jié)

Python的os模塊封裝了操作系統(tǒng)的目錄和文件操作,要注意這些函數(shù)有的在os模塊中,有的在os.path模塊中

··Pillow基本操作··

<font color=red size=5>官方文檔
<font color=#6495ED size=5>1)使用 Image 類
詳見(jiàn)Pillow文檔_Image模塊
要從文件加載圖像,可以使用open( )函數(shù),在Image模塊中:

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

加載成功后,將返回一個(gè)Image對(duì)象,可以通過(guò)使用示例屬性查看文件內(nèi)容:

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

# format 這個(gè)屬性標(biāo)識(shí)了圖像來(lái)源。如果圖像不是從文件讀取它的值就是None。size屬性是一個(gè)二元tuple,包含width和height(寬度和高度,單位都是px)。 mode 屬性定義了圖像bands的數(shù)量和名稱,以及像素類型和深度。常見(jiàn)的modes 有 “L” (luminance) 表示灰度圖像, “RGB” 表示真彩色圖像, and “CMYK” 表示出版圖像。

>>> im.show()
>>> im.save('xxx.jpg'.'jpeg')#保存圖像,第二個(gè)參數(shù)為文件格式,否則億文件名擴(kuò)展名作為格式保存。
補(bǔ)充:f,e = os.path.splittext(filename) 返回文件名、文件格式名

·圖像的基本處理:

·圖像的剪切、粘貼與合并操作

# crop, paste and merge
# PIL.Image.Image.crop 方法獲取圖像的一個(gè)子矩形選區(qū)

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中,對(duì)于一些常見(jiàn)的旋轉(zhuǎn)作了專門(mén)的定義:
    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 模塊
詳見(jiàn)Pillow文檔_ImageFliter模塊
可以通過(guò)filter( )函數(shù)使用,預(yù)定義濾波器包括:

BLUR、CONTOUR、DETAIL、EDGE_ENHANCE、EDGE_ENHANCE_MORE、EMBOSS、FIND_EDGES、SMOOTH、SMOOTH_MORE、SHARPEN。其中BLUR就是均值濾波,CONTOUR找輪廓,F(xiàn)IND_EDGES邊緣檢測(cè),使用該模塊時(shí),需先導(dǎo)入,使用方法如下:

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模塊還包括一些擴(kuò)展性強(qiáng)的濾波器:

class PIL.ImageFilter.GaussianBlur(radius=2)

Gaussian blur filter.

<font color=#6495ED size=5>3)使用ImageEnhance模塊
詳見(jiàn)Pillow文檔_ImageEnhance模塊
可以調(diào)節(jié)圖像的顏色、對(duì)比度和飽和度和銳化等:

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

#調(diào)節(jié)對(duì)比度 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) # 返回均勻間隔的數(shù)字,第三個(gè)參數(shù)表示采樣數(shù)量。
y = np.sin(x)
z = np.cos(x**2)

plt.figure(figsize=(8,4))#調(diào)用figure創(chuàng)建一個(gè)繪圖對(duì)象,figsize參數(shù)可以指定繪圖對(duì)象的寬度和高度。
plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)
plt.plot(x,z,"b--",label="$cos(x^2)$")

#plot函數(shù)的調(diào)用方式很靈活,第一句將x,y數(shù)組傳遞給plot之后,用關(guān)鍵字參數(shù)指定各種屬性:
        label : 給所繪制的曲線一個(gè)名字,此名字在圖示(legend)中顯示。只要在字符串前后添加"$"符號(hào)matplotlib就會(huì)使用其內(nèi)嵌的latex引擎繪制的數(shù)學(xué)公式。
        color : 指定曲線的顏色
        linewidth : 指定曲線的寬度
        
plt.xlabel("Time(s)")
plt.ylabel("Volt")
plt.title("PyPlot First Example")
plt.ylim(-1.2,1.2) #設(shè)置Y軸的范圍
plt.legend()       #顯示圖示
plt.show()

繪制多軸圖:
一個(gè)Figure對(duì)象可以包含多個(gè)子圖(Axes),在matplotlib中用Axes對(duì)象表示一個(gè)繪圖區(qū)域,稱為子圖,可以使用subplot()快速繪制包含多個(gè)子圖的圖表,它的調(diào)用形式如下:

subplot(numRows,numCols,plotNum) 

圖表的整個(gè)繪圖區(qū)域被等分為numRows行和numCols列,然后按照從左到下的順序?qū)γ總€(gè)區(qū)域進(jìn)行編號(hào),左上區(qū)域的編號(hào)為1。plotNum參數(shù)指定創(chuàng)建的Axes對(duì)象所在的區(qū)域 。

import numpy as np
import matplotlib.pyplot as plt
plt.figure(1) # 創(chuàng)建圖表1
plt.figure(2) # 創(chuàng)建圖表2
ax1 = plt.subplot(211) # 在圖表2中創(chuàng)建子圖1
ax2 = plt.subplot(212) # 在圖表2中創(chuàng)建子圖2
x = np.linspace(0, 3, 100)
for i in xrange(5):
    plt.figure(1)  #? # 選擇圖表1
    plt.plot(x, np.exp(i*x/3))
    #可以通過(guò)plt.sca()進(jìn)行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
# 此時(shí) lena 就已經(jīng)是一個(gè) np.array 了,可以對(duì)它進(jìn)行任意處理
lena.shape #(512, 512, 3)

·顯示某個(gè)通道

# 顯示圖片的第一個(gè)通道
lena_1 = lena[:,:,0]
plt.imshow('lena_1')
plt.show()
# 此時(shí)會(huì)發(fā)現(xiàn)顯示的是熱量圖,不是我們預(yù)想的灰度圖,可以添加 cmap 參數(shù),有如下幾種添加方法:
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) # 第二個(gè)參數(shù)如果是整數(shù),則為百分比,如果是tuple,則為輸出圖像的尺寸
plt.imshow(lena_new_sz)
plt.axis('off')
plt.savefig('lena_new_sz.png') 
#保存圖像,或?qū)rray保存為圖像:
    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

# 設(shè)置隨機(jī)數(shù)種子
random.seed(42)

# 產(chǎn)生一個(gè)1x3,[0,1)之間的浮點(diǎn)型隨機(jī)數(shù),例array([[ 0.37454012,  0.95071431,  0.73199394]])
random.rand(1, 3)

# 產(chǎn)生一個(gè)[0,1)之間的浮點(diǎn)型隨機(jī)數(shù)
random.random()

# 下邊4個(gè)沒(méi)有區(qū)別,都是按照指定大小產(chǎn)生[0,1)之間的浮點(diǎn)型隨機(jī)數(shù)array,不Pythonic…
random.random((3, 3))
random.sample((3, 3))
random.random_sample((3, 3))
random.ranf((3, 3))

# 產(chǎn)生10個(gè)[1,6)之間的浮點(diǎn)型隨機(jī)數(shù)
random.uniform(1, 6, 10)

# 產(chǎn)生10個(gè)[1,6]之間的整型隨機(jī)數(shù)
random.randint(1, 6, 10)

# 產(chǎn)生2x5的標(biāo)準(zhǔn)正態(tài)分布樣本
random.normal(size=(5, 2))

# 產(chǎn)生5個(gè),n=5,p=0.5的二項(xiàng)分布樣本
random.binomial(n=5, p=0.5, size=5)

#返回array([0,1, 2, 3, 4]),range(5)返回一個(gè)list: [0,1, 2, 3, 4]
a = np.arange(5) #可以以浮點(diǎn)型作為間隔:np.arange(1,5,.5)

# 從a中有回放的隨機(jī)采樣7個(gè)
random.choice(a, 7)

# 從a中無(wú)回放的隨機(jī)采樣7個(gè)
random.choice(a, 7, replace=False)

# 對(duì)a進(jìn)行亂序并返回一個(gè)新的array
b = random.permutation(a)

# 對(duì)a進(jìn)行in-place亂序
random.shuffle(a)

# 生成一個(gè)長(zhǎng)度為9的隨機(jī)bytes序列并作為str返回
# '\x96\x9d\xd1?\xe6\x18\xbb\x9a\xec'
random.bytes(9)

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

ndarray(下文統(tǒng)一稱之為數(shù)組)是存儲(chǔ)單一數(shù)據(jù)類型的多維數(shù)組,表示是數(shù)組對(duì)象類型 《class 'numpy.ndarray'》
<font color=#6495ED size=5>·ndarray對(duì)象重要屬性:

ndarray.ndim 返回一個(gè)number,維度,axes數(shù),rank值
ndarray.shape 返回一個(gè)tuple,表示形狀,如(2,3)表示2x3,(3,3,3)表示3x3x3
ndarray.size 返回一個(gè)number,表示ndarray中所有元素的個(gè)數(shù),等價(jià)于shape中各個(gè)元素的乘積
ndarray.dtype 返回一個(gè)dtype對(duì)象,表示ndarray中元素的類型

<font color=#6495ED size=5>創(chuàng)建矩陣(采用ndarray對(duì)象)

ndarray.array(seq[, dtype='']) 參數(shù)必須為sequence, 這個(gè)seq可以是單一的seq也可以是seq的seq的seq...,對(duì)應(yīng)著產(chǎn)生幾維的array。也可以同時(shí)指定元素類型。

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

有時(shí)候不知道數(shù)組的元素,卻知道數(shù)組的shape,這時(shí)可以通過(guò)以下三種方法生產(chǎn)數(shù)組

zeros(tuple, dtype) : np.zeros( (3,4) ),3x4全零數(shù)組
ones(tuple, dtype) : np.ones( (2,3,4), dtype=np.int16 ),2x3x4全1數(shù)組
empty(tuple):        np.empty( (2,3) ),隨機(jī)數(shù)組
eye(a):              np.eye(3),創(chuàng)建3階單位矩陣

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

np.asarray(a, dtype=None, order=None) 
#將a轉(zhuǎn)換成數(shù)組,返回ndarray對(duì)象。a可以是list、tuple,也可以轉(zhuǎn)換數(shù)據(jù)類型。

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>常見(jiàn)函數(shù)筆記

<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 :按列擴(kuò)充,返回array([[1,2]]),shape=(1,2)
    axis = 1 : 按行擴(kuò)充,返回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知識(shí)點(diǎn)總結(jié)··

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

Python 中的dict可以實(shí)現(xiàn)迅速查找。那么有沒(méi)有像數(shù)組有二維數(shù)組一樣,有二維的字典呢?比如我需要對(duì)兩個(gè)關(guān)鍵詞進(jìn)行查找的時(shí)候。2D dict 的建立:

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

通過(guò) dict_2d['a']['b']來(lái)訪問(wèn)。但是添加一個(gè)新的 “key-value”對(duì)卻比較復(fù)雜。對(duì)一維字典,可以用

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

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

但是”2-D” dictionary 新添一個(gè)”key-value”對(duì)時(shí),不能簡(jiǎn)單的用以下形式

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

因?yàn)槎S字典的兩層key和value之間會(huì)混淆,需要判斷第一個(gè)key是否已經(jīng)存在了。添加二維的字典可以通過(guò)一個(gè)函數(shù)來(lái)簡(jiǎn)單實(shí)現(xiàn):

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 來(lái)源:NumPy Tutorial - TutorialsPoint 譯者:飛龍 協(xié)議:CC BY-NC-SA 4...
    布客飛龍閱讀 33,557評(píng)論 6 97
  • Python基礎(chǔ)類型: Tuple元組,內(nèi)容不可改變,但是允許元素內(nèi)部存在list等類型的元素,并且允許改變列表的...
    bitsman閱讀 755評(píng)論 0 0
  • 輸入 readline() 輸入:abc輸出:4原因:readline()會(huì)將標(biāo)準(zhǔn)輸入的內(nèi)容全部獲取,包含最后的換...
    NapoleonY閱讀 900評(píng)論 0 0
  • python 隨筆 關(guān)鍵字 基礎(chǔ) 內(nèi)建函數(shù) 技巧 模塊 進(jìn)階
    泰_然閱讀 613評(píng)論 0 1
  • 1 簡(jiǎn)介 UIScrollView 是負(fù)責(zé)滾動(dòng)的視圖。蘋(píng)果最強(qiáng)大的地方就在于其良好的UI展示,和UE體驗(yàn)。如果不會(huì)...
    非典型技術(shù)宅閱讀 1,097評(píng)論 0 8

友情鏈接更多精彩內(nèi)容