天天看點

Numpy的基本用法

NumPy(Numerical Python) 是使用python進行機器學習不可或缺的第三方庫,它支援數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫。ndarray對象是numpy中的基本對象之一,和python清單不同之處在于:python清單可以存放任何類型的元素,而ndarray對象則隻能存放相同類型的元素。

python清單中的元素其實是一個指針,指向包含這個python對象所有資訊的某個記憶體位置。由于這裡面包含了大量的額外資訊,是以python可以自由、動态地編碼。但是這些額外資訊也會成為負擔。當python清單中的元素都是同一類型時,此時如果将資料存儲在固定類型的數組中會更高效。python的數組對象提供了數組型資料的有效存儲,而numpy則加上了高效的操作。

一. 導入numpy庫

import numpy as np      

二. 建立numpy數組(numpy array)

1. 從python清單建立(from python lists)

list=[4,5,6,7]
array=np.array(list)      
[4 5 6 7]      

注意:當使用乘号(*)時,python list做的是複制(replicate),而numpy array做的是乘法(multiply)。

print("list replication:", list*4)
print("array multiplication:", array*4)      
list replication: [4, 5, 6, 7, 4, 5, 6, 7, 4, 5, 6, 7, 4, 5, 6, 7]
array multiplication: [16 20 24 28]      

2. 從python元組建立(from python tuples)

tuple=(1,2,3,4)
array=np.array(tuple)      
[1 2 3 4]      

3. np.arange([start, ]stop, [step])

array=np.arange(7)      
[0 1 2 3 4 5 6]      
array=np.arange(7,12)      
[ 7  8  9 10 11]      
array=np.arange(7,12,2)      
[ 7  9 11]      

4. np.linspace(start, stop, num_of_elements, endpoint=True)

array=np.linspace(5,15,9)      
[ 5.    6.25  7.5   8.75 10.   11.25 12.5  13.75 15.  ]      

5. np.zeros(shape),np.ones(shape),np.full(shape, num)

array=np.zeros(5)      
[0. 0. 0. 0. 0.]      
array=np.ones((4,5))      
[[1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]]      
array=np.full((3,2),4.4)      
[[4.4 4.4]
 [4.4 4.4]
 [4.4 4.4]]      

6. np.asarray(data) --- 把資料轉變成numpy數組格式

7. 使用随機數建立:具體請見下面随機數

三. 檢視numpy數組的屬性(attributes)

1. size --- 檢視numpy array的元素個數

2. shape --- 檢視numpy array的形狀(每個次元的大小)

3. ndim --- 檢視numpy array的次元

4. dtype --- 檢視numpy array的元素的資料類型

四. 視圖和拷貝(view&copy)

1. view() --- 僅複制值(a shallow copy: same location, same value, different shape)

2. copy() --- 産生獨立拷貝(deep copy: different location)

array=np.arange(12).reshape((3,4))
x=array[:2,::2].copy()      

五. 索引(Indexing)和切片(Slicing)

1. array[num] --- 對于一維數組,傳回該數組的某個元素;對于多元數組,傳回該數組的某一行

2. array[num:] --- 對于一維數組,傳回該數組的某個元素以及其之後所有的元素;對于多元數組,傳回該數組的某一行以及其之後的所有行

3. array[:num] --- 對于一維數組,傳回該數組的某個元素之前的所有元素;對于多元數組,傳回該數組的某一行之前的所有行

4. array[row_num, col_num] --- 對于多元數組,傳回該數組某一行某一列的元素

5. array[row_num][col_num] --- 對于多元數組,傳回該數組某一行某一列的元素

6. array[start:stop:step] --- 對于一維數組,傳回該數組中從某一個元素到某一個元素,步長為step

7. array[::-1] --- 傳回逆序的數組

8. array[::2] --- 傳回數組中每隔一個元素的元素

9. array[row_num:row_num, col_num:col_num] --- 對于多元數組,傳回該數組從某一行到某一行,以及從某一列到某一列的元素

注意:索引操作傳回的是copy,而切片操作傳回的是view(如果此view的數組的值發生改變,那麼原數組的值也随之改變)

五. 使用掩碼過濾((Mask Arrays)

1. array[mask]

一般在mask裡寫一些條件,例如:array[array>0],array[array%7==0]。一些條件表示方法:&(和) ,|(或),^(異或),~(非),>(大于),<(小于),==(等于),>=(大于等于),<=(小于等于),!=(不等于)。

(注:and和or用于比較整個對象是否相同,而&和|用于比較每個對象中的内容的比特位是否相同)

六. 廣播(Broadcassting)

用于操作不同大小和形狀的數組

a1=np.arange(4).reshape((2,2))
a2=np.array([6,7])
array=a1+a2      
a1: 
 [[0 1]
 [2 3]]
a2: 
 [6 7]
array: 
 [[ 6  8]
 [ 8 10]]      

七. 改變numpy數組的形狀

1. reshape(new_shape)

array=np.arange(6).reshape((2,3))      
[[0 1 2]
 [3 4 5]]      

2. ravel() --- 把原數組變成一維數組,傳回的是變形後的數組

array=np.arange(6).reshape((2,3)).ravel()      
[0 1 2 3 4 5]      

3. flatten() --- 把原數組變成一維數組,傳回的是數組的拷貝

4. flat --- 把原數組變成一維數組,傳回的是數組的疊代器(iterator)

5. array[:, np.newaxis] --- 在原來的數組上增加一個次元(等價于array.reshape((-1,1)))

array=np.arange(4)
x=array[:,np.newaxis]      
[[0]
 [1]
 [2]
 [3]]      

八. 随機數

1. np.random.randn(dimensions) --- 生成服從标準正态分布的随機數(平均值為0,标準差為1)

array=np.random.randn(4,5)      
[[ 2.21603303 -1.64664239  2.45001994 -1.37329856 -0.69289112]
 [-0.125158   -0.88744257  0.39569274  0.82625695 -1.08780716]
 [ 0.69045662 -0.37110748 -1.23273598  0.0291697  -1.85835357]
 [-0.02345338  0.10072476  0.3590989  -0.0499124  -0.46932103]]      

2. np.random.uniform(low,high,size) --- 生成服從均勻分布的随機數

array=np.random.uniform(4,5,10)      
[4.98608384 4.70541334 4.50306141 4.44011335 4.21199919 4.32929091
 4.94769774 4.75963238 4.86165138 4.39888279]      

3. np.random.binomial(n trials,p probability of success,size) --- 生成服從二項分布的随機數

array=np.random.binomial(10,0.7,10)      
[6 8 9 7 4 7 6 8 9 8]      

4. np.random.normal(mean,std,size) --- 生成服從正态分布的随機數

array=np.random.normal(2,4,(4,5))      
[[-2.16965713  7.9465455   6.47141735  6.22990766  0.4211604 ]
 [-6.09374231  6.55291348  3.72097759  1.97147291 -7.87745844]
 [ 3.52418805 -9.37185049  5.6932117   0.35741766  1.5608389 ]
 [ 3.98630581  0.30948976 -2.24940441  3.19326126 -8.51553261]]      

5. np.random.randint(low,high,size) --- 生成從low(inclusive)到high(exclusive)的随機整數

array=np.random.randint(2,4,10)      
[3 3 2 2 2 2 2 2 3 3]      

6. np.random.rand(size) --- 生成[0, 1)區間内的随機數

array=np.random.rand(10)      
[0.06581389 0.65264403 0.97450565 0.08616934 0.55040952 0.69840924
 0.40490815 0.12367222 0.88993262 0.77037247]      

7. np.random.choice(array) --- 從一維數組中生成随機樣本

array=np.random.rand(10)
num=np.random.choice(array)      
0.95955024664668      

8. np.random.seed(num) --- 設定随機數種子

9. np.random.RandomState(num) --- 設定随機數種子,是随機數種子的容器

rng=np.random.RandomState(4)
array=rng.rand(10)      
[0.96702984 0.54723225 0.97268436 0.71481599 0.69772882 0.2160895
 0.97627445 0.00623026 0.25298236 0.43479153]      

九. 數學運算

1. +, -, *, / --- 加,減,乘,除

2. // --- 地闆除法(取整)

3. % --- 模運算(取餘)

4. ** --- 指數運算

5. np.abs() --- 傳回絕對值

6. np.exp() --- 傳回e的幂次方

7. np.sqrt() --- 傳回平方根

8. np.log() --- 傳回自然對數(以e為底)

9. np.log2() --- 傳回以2為底對數

10. np.log10() --- 傳回以10為底對數

11. np.sin() --- 傳回正弦

12. np.cos() --- 傳回餘弦

13. np.std() --- 傳回标準差

14. np.var() --- 傳回方差

15. np.prod() --- 傳回乘積

16. np.sum() --- 傳回總和

17. np.mean() --- 傳回平均值

18. np.min() --- 傳回最小值

19. np.max() --- 傳回最大值

20. np.median() --- 傳回中位數

十. 合并numpy數組

1. np.concatenate((array1,array2,...), axis=0) --- 按行或列合并數組(數組在合并方向的次元需一緻),axis=0表示按行合并,axis=1表示按列合并

a1=np.arange(4).reshape((2,2))
a2=np.array([[6,7]])
array=np.concatenate((a1,a2),axis=0)      
[[0 1]
 [2 3]
 [6 7]]      

2. np.stack((array1,array2,...), axis=0) --- 堆疊數組,增加一個次元

3. np.hstack((array1,array2,...)) --- 相當于按列合并數組

4. np.vstack((array1,array2,...)) --- 相當于按行合并數組

十一. 分隔numpy數組

1. np.split(array, n, axis=0) --- 按行或列将數組均勻分隔成n份,axis=0表示按行分隔,axis=1表示按列分隔

a1=np.array([[6,7],[8,9]])
array=np.split(a1,2)      
[array([[6, 7]]), array([[8, 9]])]      

2. np.hsplit(array, n) --- 相當于按列分隔數組

3. np.vsplit(array, n) --- 相當于按行分隔數組

十二. 線性代數相關(linear algebra)

1. np.mat(array) --- 将數組轉換成矩陣

2. np.dot(a,b) --- 對于一維數組(向量),計算這兩個數組的點積,對于多元數組(矩陣),運作矩陣乘法

3. np.outer(a,b) --- 計算兩個向量的外積

4. np.eye(num) --- 建立一個num*num的機關矩陣(identity matrix)

5. np.linalg.solve(“Coefficient” matrix, y) --- 求解線性方程組

6. np.linalg.eig(matrix) --- 求矩陣的特征值,特征向量

7. np.linalg.lstsq(“Coefficient” matrix, y) --- 傳回線性矩陣用最小二乘法獲得的解

8. np.linalg.det(matrix) ---矩陣求行列式

9. np.linalg.inv(matrix) --- 矩陣求逆

10. np.linalg.norm(array) --- 求範數

11. np.trace(array) --- 求矩陣的迹(對角線元素的和)

12. np.diag(matrix) --- 傳回矩陣的對角線元素

13. np.linalg.svd(array) --- 奇異值分解

十三. 其他

1. np.argmax(array) --- 傳回最大值的索引

2. np.argmin(array) --- 傳回最小值的索引

3. np.any(array, axis=None) --- 測試數組(按行或按列)中的任意一個元素是否為真

4. np.all(array, axis=None) --- 測試數組(按行或按列)中的所有元素是否都為真

5. np.meshgrid(x,y) --- 生成網格點坐标矩陣

x=np.arange(4)
y=np.arange(4,7)

X,Y=np.meshgrid(x,y)      
x: [0 1 2 3]
y: [4 5 6]      
X: [[0 1 2 3]
 [0 1 2 3]
 [0 1 2 3]]
Y: [[4 4 4 4]
 [5 5 5 5]
 [6 6 6 6]]      
Numpy的基本用法

X,Y = meshgrid(x,y) :将向量x和y定義的區域轉換成矩陣X和Y,其中矩陣X的行向量是向量x的簡單複制,而矩陣Y的列向量是向量y的簡單複制。假設x是長度為m的向量,y是長度為n的向量,則最終生成的矩陣X和Y的次元都是 n*m 。

6. astype(dtype) --- 轉換資料類型

7. np.where(condition, x, y) --- 如果滿足條件(condition),輸出x,不滿足則輸出y

8. np.count_nonzero(array) --- 統計數組中非零值的個數

9. np.sort(array) --- 傳回排好序的數組,預設的排序算法為快速排序

10. np.argsort(array) --- 傳回原始數組排好序的索引值

11. np.partition(array, k) --- 找出數組中第k小的值,輸出一個新數組,最左邊是第k小的值,往右是任意順序的其他值

12. np.argpartition(array, k) --- 找出數組中第k小的值的索引,輸出一個新數組,最左邊是第k小的值的索引,往右是任意順序的其他值的索引

13. np.percentitle(array, percentile, axis=None) --- 傳回數組百分比分位數

array=np.array([[6,7],[8,9]])
x=np.percentile(array,60,axis=0)      
[7.2 8.2]