本文的主要內容是根據MOOC中嵩天老師的Python數據分析與展示課程進行總結的,可供讀者學習和複習numpy的基礎知識點。
MOOC中嵩天老師的課程鏈接:https://www.icourse163.org/learn/BIT-1001870002?tid=1206192225#/learn/announce
目錄
一、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') #以灰度顯示,默認會是僞彩色
結果: