Python中Numpy庫的基礎知識點

本文的主要內容是根據MOOC中嵩天老師的Python數據分析與展示課程進行總結的,可供讀者學習和複習numpy的基礎知識點。

MOOC中嵩天老師的課程鏈接:https://www.icourse163.org/learn/BIT-1001870002?tid=1206192225#/learn/announce

目錄

一、NumPy數組的創建與變換

1. 數組的創建

2. NumPy的屬性

3. 數組的變換

4. 數組的索引和切片

5. 數組的運算和運算函數

二、NumPy的文件讀取和保存

1. CSV文件(用逗號分隔)

2. 多維數據的存取

3. Numpy的便捷文件存取

三、NumPy隨機、統計、梯度函數的介紹

1. Numpy的隨機函數

2. Numpy的統計函數

3. NumPy的梯度函數

四、圖像的手繪效果

1. 圖像的數組表示

2. 圖像的變換

3. 圖像的顯示


一、NumPy數組的創建與變換

1. 數組的創建

        可以通過以下幾種方法創建數組

(1)從Python中的列表、元組等類型中創建ndarray數組;eg. a = np.array([1,2,3])或者a = np.array((1,2,3));

import numpy as np

a = np.array([1,2,3])
b = np.array((1,2,3))

(2)使用Numpy中函數創建ndarray
常用函數:

函數中shape的地方需要用元組表示,實例:

import numpy as np

a = np.arange(10)        #生成0-9的數組
b = np.ones((3,4))         #生成3×4的全1數組
c = np.zeros((3,4))        #生成3×4的全0數組
d = np.full((2,3),6)     #生成2×3的全是6的數組
e = np.eye(5)            #生成單位矩陣

(3)生成等間隔數組和合並數組:
a = np.linspace(start,stop,N, endpoint=True) 
作用:在起點和終點的區間範圍內生成N個數據,因爲endpoint=True,所以生成的數組包含最後一個點(默認包含);
temp = np.concatenate((a,b,c,...),axis=n) 
作用:將a,b,c在第n個維度上進行合併,除了合併的維度可以不同,其他的維度必須相同才能進行合併,否則報錯。

import numpy as np

a = np.linspace(0,10,6,endpoint=True)    #生成[0,2,4,6,8,10]
b = np.linspace(0,20,6)
temp = np.concatenate((a,b),axis=0) 

(4)以某一數組爲藍本生成新數組:

import numpy as np

a = np.random.rand(3,4)    #生成3×4的隨機數組
a1 = np.ones_like(a)       #生成與a具有相同維度的全1數組
a2 = np.zeros_like(a)      #生成與a具有相同維度的全1數組
a3 = np.full_like(a,val)   #生成與a具有相同維度的值全爲val的數組

2. NumPy的屬性

import numpy as np

array = np.array([[1,2,3],[2,3,4]])
print(array)
print('number of dim:', array.ndim)
print('shape:',array.shape)
print('size:',array.size)

3. 數組的變換


數組元素類型的變換:a.astype(dtype)   
eg.  a = a.astype(int),可以將數組a的數據類型變爲整形;
數組變換到列表:list = a.tolist()

4. 數組的索引和切片

索引:維度的索引從0開始,a[0,1,3]表示索引數組a中由第1維第一層、第2維第二層和第3維第四層所確定的數據;
切片:a = np.arange(10), 則a[2:5]表示[2,3,4];  a[2:8:3]表示[2,5];  a[::2]表示[0,2,4,6,8];

5. 數組的運算和運算函數

二、NumPy的文件讀取和保存

1. CSV文件(用逗號分隔)

寫入:np.savetxt(frame, array, fmt='%.18e', delimiter=None)

frame:文件、字符串或產生器,可以是.gz或.bz2的壓縮文件;
array:存入文件的數組;
fmt:寫入文件的格式,例如:%d %.2f %.18e
delimiter:分割字符串,默認是任何空格,如果是CSV文件,則‘,’;
它可以生成任意帶有分割符的文件;
eg: np.savetxt('a.csv', a, fmt = '%d', delimiter = ','); 輸出整形
np.savetxt('a.csv', a, fmt = '%.1f', delimiter = ','); 輸出帶1位小數

讀取:np.loadtxt(frame, dtype=np.float, delimiter=None, unpack=False)
frame:需要讀取的文件,可以是壓縮文件;
dtype:需要將文件的數據轉化爲特定格式,由dtype指定;
delimiter:分割字符串,默認是任何空格,對於CSV文件是',';
unpack:如果True,讀入屬性將分別寫入不同變量;
np.savetxt和np.loadtxt只能存取一維或二維的數據;

2. 多維數據的存取

寫入:a.tofile(frame,sep=' ', format='%d');

讀取:np.fromfile(frame, dtype=float, count=-1,sep='');

frame:文件、字符串;

dtype:讀取的數據類型;

count:讀入元素個數,-1表示讀入整個文件;

sep:數據分割字符串,如果空串,用二進制讀入;

這種讀取方法要知道dtype和dim;那怎麼辦呢,新建一個文件說明;

3. Numpy的便捷文件存取

寫入:np.save(fname,array)或np.savez(fname,array)

讀取:np.load(fname)

fname:文件名,以.npy爲擴展名,壓縮擴展名爲.npz;

array:數組變量

三、NumPy隨機、統計、梯度函數的介紹

1. Numpy的隨機函數

隨機函數1

np.random.rand(d0,d1,...,dn):產生n維的隨機數組,每個元素的值在[0,1)之間均勻分佈;

np.random.randn(d0,d1,...,dn):產生n維的隨機數組,每個元素值爲標準正態分佈;

np.random.randint(low,high,shape):生成一個shape形狀的在low和high之間隨機整數數組;

np.random.seed(s):隨機數種子,s是給定的種子值;在使用上述隨機函數前使用種子值,可以產生種子值對應的隨機數;種子值相同的隨機數是相同的。

隨機函數2

np.random.shuffle(a): 對a的第一維進行隨機排列,改變a;

np.random.permutation(a):產生第一軸亂序的新數組,不改變a本身;

np.random.choice(a,size,replace,p):從一維數組a中以概率p抽取元素,形成size形狀新數組,replace表示是否可以重用元素,默認爲True;p是和a同尺寸的概率矩陣;

eg: np.random.choice(a.flatten(),(6,8))

隨機函數3

np.random.uniform(low,high,shape): 產生具有均勻分佈的數組;

np.random.normal(loc,scale,shape): 產生具有正態分佈的數據,loc均值,scale標準差,shape形狀;

np.random.poission(lam,size): 產生具有泊松分佈的數組,lam隨機事件發生率,size形狀;

2. Numpy的統計函數

NumPy直接提供的統計類函數,如np.std(), np.var(), np.average();

np.sum(a,axis=None): 根據給定軸axis計算數組a相關元素之和,axis等於整數或元組;

np.mean(a,axis=None): 同理,計算平均值;

np.average(a,axis=None,weights=None): 可求加權平均值;

np.std(a,axis=None):計算標準差;

np.var(a,axis=None):計算方差;

np.min(a),np.max(a):計算a中元素的最小值、最大值;

np.argmin(a),np.argmax(a):計算數組中a中元素最小最大值的降一維後下標;

np.unravel_index(index,shape):根據shape將一維下標index轉換成多維下標;

np.ptp(a): 計算數組a中元素最大值與最小值的差;

np.median(a): 計算數組a中元素的中位數(中值);

3. NumPy的梯度函數

np.gradient(f): 計算數組f中元素的梯度,當f爲多維時,返回每個維度梯度;

梯度:連續值之間的變化率,即斜率;

四、圖像的手繪效果

1. 圖像的數組表示

    我們平時常見的圖像很適合用數組表示;灰度圖像就是二維數組,彩色圖像是三維圖像(在二維的基礎上每個元素變爲3個);這裏使用PIL庫(Python Image Library)輔助處理圖像,PIL庫是一個具有強大圖像處理能力的第三方庫,常用於處理圖像。

引用:from PIL import Image

I = np.array(Image.open('1.jpg')), I就是一個保存着圖片數據的數組;

I.shape爲(x,y,3); I.dtype爲uint8

2. 圖像的變換

圖像是數組,對數組的操作即可改變圖像;

I = np.array(Image.open('1.jpg').convert('L'))  生成灰度圖像;

實現圖像反轉代碼:

import numpy as np
from PIL import Image

I = np.array(Image.open('1.jpg').convert('L'))
print(I.shape,I.dtype)
b = 255-I    #如果是三維的彩色數據,則爲[255,255,255]-I
im = Image.fromarray(b.astype('uint8'))
im.save('3.jpg')

3. 圖像的顯示

①對於圖像類型的變量,直接運行變量本身就能在命令行中顯示圖像(本人在Spyder中運行的);

②使用im.show('filename')可以打開一個窗口顯示圖像,窗口標題是輸入的'filename' ;

③另外一種是數組的可視化,圖像的可視化推薦使用matplotlib.pyplot中imshow()函數,使用方法如下:

import matplotlib.pyplot as plt
I = np.random.randint(0,255,(200,200)).astype(np.uint8)    #產生隨機圖像
plt.imshow(I,cmap='gray')    #以灰度顯示,默認會是僞彩色

結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章