numpy模塊之創建矩陣、矩陣運算


本文參考給妹子講python  https://zhuanlan.zhihu.com/p/34673397

NumPy是Numerical Python的簡寫,是高性能科學計算和數據分析的基礎包,他是許多高級工具的構建基礎。

他的核心功能是:

1.多維向量的描述和快速高效計算能力,讓數組和矩陣的使用更加自然; 2.大量實用的數學函數,支撐復雜的線性代數、隨機數生成以及傅里葉變換函數 3.具備數據的磁盤讀寫工具
對於同樣的數值計算任務,使用NumPy要比直接編寫Python代碼便捷的多。
這是因為NumPy能夠直接對數組和矩陣進行操作,可以省略很多循環語句,
其眾多的數學函數也會讓編寫代碼的工作輕松許多。
同時底層算法在設計時有着優異的的性能,NumPy中數組的存儲效率和輸入輸出性能均遠遠優於Python中等價的基本數據結構,如嵌套list。
example1:用python對象的list來創建ndarray對象
import numpy as np  
data = [1,2.11,4,59] 
arr = np.array(data) 
print(arr) 
print(type(arr)) 

 [  1.     2.11   4.    59.  ] 
<class 'numpy.ndarray'>

當然ndarray對象也可以轉換成list

import numpy as np  

arr = np.arange(8) 
L = arr.tolist() 
print(type(L)) 
print(L)  

<class 'list'> 
[0, 1, 2, 3, 4, 5, 6, 7]

example2:用嵌套列表來創建多維矩陣

import numpy as np  

data = [[1,2,3,4],[5,6,7,8.2]] 
arr = np.array(data) 
print(arr) 
print(arr.ndim) 
print(arr.shape) 
print(arr.dtype) 
print(type(arr))  

[[ 1.   2.   3.   4. ]  
[ 5.   6.   7.   8.2]] 
2 
(2, 4) 
float64 
<class 'numpy.ndarray'>
#ndim就是數組的維數,

#data.ndim = len(data.shape)

example3:對已有的ndarray數組進行數據類型的顯式轉換

import numpy as np  

arr1 = np.array([1,2,3,4], dtype=np.float64) 
arr2 = np.array([1,2,3,4], dtype=np.int32) 
arr3 = arr2.astype(np.float64)  
print(arr1) 
print(arr2) 
print(arr3)  

[ 1.  2.  3.  4.] 
[1 2 3 4] 
[ 1.  2.  3.  4.]
#我們看到arr2在創建ndarray數組時,顯式指定了元素類型為int32,后續又通過astype進行數據類型的顯式轉換,創建了新的數組arr3,其數據類型為float64浮點型。

example4:創建全0、全1、沒有具體值的矩陣

import numpy as np  

arr_0 = np.zeros(8)  #全0矩陣
arr_1 = np.ones((3, 8)) # 3行8列全1矩陣
arr_e = np.empty((2,3,2)) # 維度為2,3,2的矩陣
print(arr_0) 
print(arr_1) 
print(arr_e)  

[ 0.  0.  0.  0.  0.  0.  0.  0.]  

[[ 1.  1.  1.  1.  1.  1.  1.  1.]  
 [ 1.  1.  1.  1.  1.  1.  1.  1.]  
 [ 1.  1.  1.  1.  1.  1.  1.  1.]]  

[[[  2.05931344e-316   1.87072344e-316]   
  [  1.85828998e-316   1.98442969e-316]   
  [  1.85755284e-316   1.70134311e-316]]   
 [[  1.71304417e-316   2.37875336e-316]   
  [  1.84704347e-316   1.70132375e-316]   
  [  2.46176627e-316   2.34552329e-316]]]

除此之外,之前我們講過python內置函數中有一個range函數,np中也有一個類似的函數實現該功能

 
         
import numpy as np  

arr1 = np.arange(8) 
print(arr1) 
print(type(arr1))  

[0 1 2 3 4 5 6 7] 
<class 'numpy.ndarray'>  


import numpy as np  

arr2 = np.arange(0,11,2,dtype=float) 
print(arr2)  

[  0.   2.   4.   6.   8.  10.]
 
         

還有一種網格數據的生成方法:即指定起始點和終止點(包含),以及網格點的個數

 
         
import numpy as np  

arr = np.linspace(0,80,5) 
print(arr)  

[  0.  20.  40.  60.  80.]
 
         

ndarray數據的維度轉換與最簡單的標量運算:

 
         
import numpy as np  

a = np.arange(24).reshape((6,4)) 
print(a)  

[[ 0  1  2  3]  
 [ 4  5  6  7]  
 [ 8  9 10 11]  
 [12 13 14 15]  
 [16 17 18 19]  
 [20 21 22 23]]

# 然后將其展平,即將其轉化為一個24項的一維數組
import numpy as np  

a = np.arange(24).reshape((6,4)) 
print(a.flatten())  

[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]

#還有一種維度轉換的使用場景,如,將之前的6×4的二維數組,轉化為3×8的二維數組

import numpy as np  

a = np.arange(24).reshape((6,4)) 
a.resize((3,8)) 
print(a)  

[[ 0  1  2  3  4  5  6  7]  
 [ 8  9 10 11 12 13 14 15]  
 [16 17 18 19 20 21 22 23]]

#轉置
import numpy as np  

a = np.arange(24).reshape((6,4)) 
print(a) 
print(a.transpose())  # 或者縮寫成 a.T

[[ 0  1  2  3]  
 [ 4  5  6  7]  
 [ 8  9 10 11]  
 [12 13 14 15]  
 [16 17 18 19]  
 [20 21 22 23]]  

[[ 0  4  8 12 16 20]  
 [ 1  5  9 13 17 21]  
 [ 2  6 10 14 18 22]  
 [ 3  7 11 15 19 23]]
 
         

數組的組合

 
         
# 首先是水平的組合

import numpy as np 
 
a = np.arange(6).reshape((2,3)) 
b = a * 2 
print(a) 
print(b) 
print(np.hstack((a,b)))  

[[0 1 2]  
 [3 4 5]]  

[[ 0  2  4]  
 [ 6  8 10]]  

[[ 0  1  2  0  2  4]  
 [ 3  4  5  6  8 10]]
# 再來看看垂直組合

import numpy as np  

a = np.arange(6).reshape((2,3)) 
b = a * 2 
print(a) 
print(b) 
print(np.vstack((a,b)))  

[[0 1 2]  
 [3 4 5]]  

[[ 0  2  4]  
 [ 6  8 10]]  

[[ 0  1  2]  
 [ 3  4  5]  
 [ 0  2  4]  
 [ 6  8 10]]
 
         

最后我們來看看數組的標量計算

其實下面介紹的數組的標量計算功能用傳統的基本數組List類型肯定是都能實現的,但是NumPy提供的最主要的便利之一就是,我們可以像操作原子數據類型一樣對NumPy對象進行操作:不需要顯式循環就可以對它們進行加、減、乘等運算,避免了顯式循環的使用,使得代碼更加清晰。同時,NumPy底層是用C語言實現的,因此代碼運行的也更快。

 
         
import numpy as np  

arr = np.array([[1,2,3],[4,5,6]],dtype=np.float64)  
print(arr + 1) 
print(arr ** 2) 
print(1/arr)  

[[ 2.  3.  4.]  
 [ 5.  6.  7.]]  

[[  1.   4.   9.]  
 [ 16.  25.  36.]]  

[[ 1.          0.5         0.33333333]  
 [ 0.25        0.2         0.16666667]]

# 另外還有數組與數組之間的運算,這里暫時只談論維數相同的數組運算
import numpy as np  

arr = np.array([[1,2,3],[4,5,6]],dtype=np.float64)  
print(arr+arr) 
print(arr*arr)  

[[  2.   4.   6.]  
 [  8.  10.  12.]] 

[[  1.   4.   9.]  
 [ 16.  25.  36.]]

#對整個向量運用基本數學表達式
import numpy as np 
 
arr = np.arange(8) 
print(np.sin(arr))  

[ 0.          0.84147098  0.90929743  0.14112001 -0.7568025  -0.95892427  -0.2794155   0.6569866 ]
 
         

 





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM