学习笔记——Numpy基本操作(二)
為了方便我把本文介紹的一些函數全部列舉了
數學函數
三角函數:sin()、cos()、tan()
numpy.around()
numpy.floor()
numpy.ceil()
算術函數
加減乘除: add(),subtract(),multiply() 和 divide()
numpy.reciprocal()
numpy.power()
numpy.mod()
numpy.remainder()
統計函數
numpy.amin() 和 numpy.amax()
numpy.median()
numpy.mean()
標準差和方差:np.std和np.var numpy.sort()
排序、條件刷選函數
numpy.sort()
numpy.argsort()
numpy.where()
副本和視圖 副本或深拷貝
線性代數 numpy.dot()
numpy.vdot()
numpy.inner()
numpy.matmul ()
numpy.linalg.det()
numpy.linalg.solve()
文章目錄
- Numpy 線性代數
- 持久化
- 1、h5py
- 2、cPickle
- 基本操作
- NumPy 數學函數
- NumPy 算術函數
- NumPy 統計函數
- NumPy 排序、條件刷選函數
- NumPy 副本和視圖
- NumPy 線性代數
Numpy 線性代數
NumPy 提供了線性代數函數庫 linalg,該庫包含了線性代數所需的所有功能,可以看看下面的說明:
| dot | 兩個數組的點積,即元素對應相乘 |
| vdot | 兩個向量的點積 |
| inner | 兩個數組的內積 |
| matmul | 兩個數組的矩陣積 |
| determinant | 數組的行列式 |
| solve | 求解線性矩陣方程 |
| inv | 計算矩陣的乘法逆矩陣 |
- numpy.dot() 對于兩個一維的數組,計算的是這兩個數組對應下標元素的乘積和(數學上稱之為內積);對于二維數組,計算的是兩個數組的矩陣乘 積;對于多維數組,它的通用計算公式如下,即結果數組中的每個元素都是:數組 a 的最后一維上的所有元素與數組 b 的倒數第二位上的所有元素 的乘積和:dot(a,b)[i,j,k,m] = sum(a[i,j,:]*b[k,:,m])。
- numpy.vdot() 函數是兩個向量的點積。 如果第一個參數是復數,那么它的 共軛復數會用于計算。 如果參數是多維數組,它會被展開。
- numpy.inner() 函數返回一維數組的向量內積。對于更高的維度,它返回最 后一個軸上的和的乘積。
- numpy.matmul 函數返回兩個數組的矩陣乘積。 雖然它返回二維數組的正 常乘積,但如果任一參數的維數大于2,則將其視為存在于最后兩個索引 的矩陣的棧,并進行相應廣播。
- numpy.linalg.det() 函數計算輸入矩陣的行列式。行列式在線性代數中是非 常有用的值。 它從方陣的對角元素計算。 對于2×2 矩陣,它是左上和右 下元素的乘積與其他兩個的乘積的差。
- numpy.linalg.solve() 函數給出了矩陣形式的線性方程的解。
- numpy.linalg.inv() 函數計算矩陣的乘法逆矩陣。
- 逆矩陣(inverse matrix):設 A 是數域上的一個 n 階矩陣,若在相同數域 上存在另一個 n 階矩陣 B,使得: AB=BA=E ,則我們稱 B 是 A 的逆矩陣, 而 A 則被稱為可逆矩陣。
持久化
1、h5py
一個 HDF5 文件是一種存放兩類對象的容器:dataset 和 group. Dataset 是類似于數
組的數據集,而 group 是類似文件夾一樣的容器,存放 dataset 和其他 group。在使用
h5py 的時候需要牢記一句話:groups 類比詞典,dataset 類比 Numpy 中的數組。
HDF5 的 dataset 雖然與 Numpy 的數組在接口上很相近,但是支持更多對外透明的
存儲特征,如數據壓縮,誤差檢測,分塊傳輸。
詳細文檔:http://docs.h5py.org/en/stable/quick.html
示例:
import numpy as np import h5pyN=1000 def pickle_serialization(): #序列化with h5py.File('data.h5','w') as hf:array = np.random.randn(N,N)group = hf.create_group('group') #group相當于文件夾group.create_dataset('dataset',data=array) #dataset相對于具體文件print('Serialization:{}'.format(array))def pickle_deserialization(): #反序列化with h5py.File('data.h5','r') as hf:for key in hf.keys():group = hf.get(key)for item in group.items():print('after deserialization:{}'.format(group[item[0]]))if __name__ == '__main__':pickle_serialization()pickle_deserialization()2、cPickle
在 python 中,一般可以使用 pickle 類來進行 python 對象的序列化,而 cPickle 提供了一個更快速簡單的接口,如 python 文檔所說的:“cPickle – A faster pickle”。
cPickle 可以對任意一種類型的 python 對象進行序列化操作,比如 list,dict,甚至是一個類的對象等。而所謂的序列化,我的粗淺的理解就是為了能夠完整的保存并能夠完全可逆的恢復。
詳細文檔:https://docs.python.org/2.2/lib/node61.html
示例:
import pickle import numpy as npN=1000 def pickle_serialization(): #序列化with open('data.pkl','wb') as f:array = np.random.randn(N,N)pickle.dump(array,f)print('Serialization:{}'.format(array))def pickle_deserialization(): #反序列化with open('data.pkl','rb') as f:array = pickle.load(f)print('Deserialization:{}'.format(array))if __name__ == '__main__':pickle_serialization()pickle_deserialization()基本操作
NumPy 數學函數
1、NumPy 提供了標準的三角函數:sin()、cos()、tan()
注意:三角函數都是使用弧度制。
import numpy as npa = np.array([0,30,45,60,90]) print ('不同角度的正弦值:') # 通過乘 pi/180 轉化為弧度 print (np.sin(a*np.pi/180)) print ('') print ('數組中角度的余弦值:') print (np.cos(a*np.pi/180)) print ('') print ('數組中角度的正切值:') print (np.tan(a*np.pi/180))--------------------- 執行結果: 不同角度的正弦值: [0. 0.5 0.70710678 0.8660254 1. ]數組中角度的余弦值: [1.00000000e+00 8.66025404e-01 7.07106781e-01 5.00000000e-016.12323400e-17]數組中角度的正切值: [0.00000000e+00 5.77350269e-01 1.00000000e+00 1.73205081e+001.63312394e+16]2、numpy.around() 函數返回指定數字的四舍五入值
import numpy as npa = np.array([1.0,5.55, 123, 0.567, 25.532]) print ('原數組:') print (a) print ('') print ('舍入后:') print (np.around(a))-------------- 執行結果: 原數組: [ 1. 5.55 123. 0.567 25.532]舍入后: [ 1. 6. 123. 1. 26.]3、numpy.floor() 返回數字的下舍整數
import numpy as npa = np.array([-1.7, 1.5, -0.2, 0.6, 10]) print ('提供的數組:') print (a) print ('') print ('修改后的數組:') print (np.floor(a))----------- 執行結果: 提供的數組: [-1.7 1.5 -0.2 0.6 10. ]修改后的數組: [-2. 1. -1. 0. 10.]4、numpy.ceil() 返回數字的上入整數
import numpy as npa = np.array([-1.7, 1.5, -0.2, 0.6, 10]) print ('提供的數組:') print (a) print ('') print ('修改后的數組:') print (np.ceil(a))------------------- 執行結果: 提供的數組: [-1.7 1.5 -0.2 0.6 10. ]修改后的數組: [-1. 2. -0. 1. 10.]NumPy 算術函數
1、NumPy 算術函數包含簡單的加減乘除: add(),subtract(),multiply() 和 divide()
import numpy as np a = np.arange(9, dtype = np.float_).reshape(3,3) print ('第一個數組:') print (a) print ('') print ('第二個數組:') b = np.array([10,10,10]) print (b) print ('') print ('兩個數組相加:') print (np.add(a,b)) print ('') print ('兩個數組相減:') print (np.subtract(a,b)) print ('') print ('兩個數組相乘:') print (np.multiply(a,b)) print ('') print ('兩個數組相除:') print (np.divide(a,b))------------------------- 執行結果: 第一個數組: [[0. 1. 2.][3. 4. 5.][6. 7. 8.]]第二個數組: [10 10 10]兩個數組相加: [[10. 11. 12.][13. 14. 15.][16. 17. 18.]]兩個數組相減: [[-10. -9. -8.][ -7. -6. -5.][ -4. -3. -2.]]兩個數組相乘: [[ 0. 10. 20.][30. 40. 50.][60. 70. 80.]]兩個數組相除: [[0. 0.1 0.2][0.3 0.4 0.5][0.6 0.7 0.8]]2、numpy.reciprocal() 函數返回參數逐元素的倒數。如 1/4 倒數為 4/1
import numpy as np a = np.array([0.25, 1.33, 1, 100]) print ('我們的數組是:') print (a) print ('') print ('調用 reciprocal 函數:') print (np.reciprocal(a))--------------------- 執行結果: 我們的數組是: [ 0.25 1.33 1. 100. ]調用 reciprocal 函數: [4. 0.7518797 1. 0.01 ]3、numpy.power() 函數將第一個輸入數組中的元素作為底數,計算它與第二個輸入數組中相應元素的冪
import numpy as np a = np.array([10,100,1000]) print ('我們的數組是;') print (a) print ('') print ('調用 power 函數:') print (np.power(a,2)) print ('') print ('第二個數組:') b = np.array([1,2,3]) print (b) print ('') print ('再次調用 power 函數:') print (np.power(a,b))---------------------- 執行結果: 我們的數組是; [ 10 100 1000]調用 power 函數: [ 100 10000 1000000]第二個數組: [1 2 3]再次調用 power 函數: [ 10 10000 1000000000]4、numpy.mod() 計算輸入數組中相應元素的相除后的余數。 函數 numpy.remainder() 也產生相同的結果
import numpy as npa = np.array([10,20,30]) b = np.array([3,5,7]) print ('第一個數組:') print (a) print ('') print ('第二個數組:') print (b) print ('') print ('調用 mod() 函數:') print (np.mod(a,b)) print ('') print ('調用 remainder() 函數:') print (np.remainder(a,b))-------------------------------- 執行結果: 第一個數組: [10 20 30]第二個數組: [3 5 7]調用 mod() 函數: [1 0 2]調用 remainder() 函數: [1 0 2]NumPy 統計函數
1、numpy.amin() 和 numpy.amax()
import numpy as np a = np.array([[3,7,5],[8,4,3],[2,4,9]]) print ('我們的數組是:') print (a) print ('') print ('調用 amin() 函數:') print (np.amin(a,1)) #1 :axis=1軸 print ('') print ('再次調用 amin() 函數:') print (np.amin(a,0)) print ('') print ('調用 amax() 函數:') print (np.amax(a)) print ('') print ('再次調用 amax() 函數:') print (np.amax(a, axis = 0))---------------------------- 執行結果: 我們的數組是: [[3 7 5][8 4 3][2 4 9]]調用 amin() 函數: [3 3 2]再次調用 amin() 函數: [2 4 3]調用 amax() 函數: 9再次調用 amax() 函數: [8 7 9]2、numpy.median() 函數用于計算數組 a 中元素的中位數(中值)
import numpy as np a = np.array([[30,65,70],[80,95,10],[50,90,60]]) print ('我們的數組是:') print (a) print ('') print ('調用 median() 函數:') print (np.median(a)) print ('') print ('沿軸 0 調用 median() 函數:') print (np.median(a, axis = 0)) print ('') print ('沿軸 1 調用 median() 函數:') print (np.median(a, axis = 1))---------------------------- 執行結果: 我們的數組是: [[30 65 70][80 95 10][50 90 60]]調用 median() 函數: 65.0沿軸 0 調用 median() 函數: [50. 90. 60.]沿軸 1 調用 median() 函數: [65. 80. 60.]3、numpy.mean() 函數返回數組中元素的算術平均值。 如果提供了軸,則沿其計算
import numpy as np a = np.array([[1,2,3],[3,4,5],[4,5,6]]) print ('我們的數組是:') print (a) print ('') print ('調用 mean() 函數:') print (np.mean(a)) print ('') print ('沿軸 0 調用 mean() 函數:') print (np.mean(a, axis = 0)) print ('') print ('沿軸 1 調用 mean() 函數:') print (np.mean(a, axis = 1))------------------------ 執行結果: 我們的數組是: [[1 2 3][3 4 5][4 5 6]]調用 mean() 函數: 3.6666666666666665沿軸 0 調用 mean() 函數: [2.66666667 3.66666667 4.66666667]沿軸 1 調用 mean() 函數: [2. 4. 5.]4、標準差和方差
import numpy as np print (np.std([1,2,3,4])) print (np.var([1,2,3,4]))------------------------------ 執行結果: 1.118033988749895 1.25NumPy 排序、條件刷選函數
1、numpy.sort() 函數返回輸入數組的排序副本
import numpy as np a = np.array([[3,7],[9,1]]) print ('我們的數組是:') print (a) print ('') print ('調用 sort() 函數:') print (np.sort(a)) print ('') print ('按列排序:') print (np.sort(a, axis = 0)) print ('') # 在 sort 函數中排序字段 dt = np.dtype([('name', 'S10'),('age', int)]) a = np.array([("raju",21),("anil",25),("ravi", 17), ("amar",27)], dtype = dt) print ('我們的數組是:') print (a) print ('') print ('按 name 排序:') print (np.sort(a, order = 'name'))----------------------------------- 執行結果: 我們的數組是: [[3 7][9 1]]調用 sort() 函數: [[3 7][1 9]]按列排序: [[3 1][9 7]]我們的數組是: [(b'raju', 21) (b'anil', 25) (b'ravi', 17) (b'amar', 27)]按 name 排序: [(b'amar', 27) (b'anil', 25) (b'raju', 21) (b'ravi', 17)]2、numpy.argsort() 函數返回的是數組值從小到大的索引值
import numpy as np x = np.array([3, 1, 2]) print ('我們的數組是:') print (x) print ('') print ('對 x 調用 argsort() 函數:') y = np.argsort(x) print (y) print ('') print ('以排序后的順序重構原數組:') print (x[y]) print ('') print ('使用循環重構原數組:') for i in y: print (x[i])------------------------------------- 執行結果: 我們的數組是: [3 1 2]對 x 調用 argsort() 函數: [1 2 0]以排序后的順序重構原數組: [1 2 3]使用循環重構原數組: 1 2 33、numpy.where() 函數返回輸入數組中滿足給定條件的元素的索引
import numpy as np x = np.arange(9.).reshape(3, 3) print ('我們的數組是:') print (x) print ( '大于 3 的元素的索引:') y = np.where(x > 3) print (y) print ('使用這些索引來獲取滿足條件的元素:') print (x[y])----------------------------------- 執行結果: 我們的數組是: [[0. 1. 2.][3. 4. 5.][6. 7. 8.]] 大于 3 的元素的索引: (array([1, 1, 2, 2, 2]), array([1, 2, 0, 1, 2])) 使用這些索引來獲取滿足條件的元素: [4. 5. 6. 7. 8.]NumPy 副本和視圖
1、副本或深拷貝
import numpy as np a = np.array([[10,10], [2,3], [4,5]]) print ('數組 a:') print (a) print ('創建 a 的深層副本:') b = a.copy() print ('數組 b:') print (b) # b 與 a 不共享任何內容 print ('我們能夠寫入 b 來寫入 a 嗎?') print (b is a) print ('修改 b 的內容:') b[0,0] = 100 print ('修改后的數組 b:') print (b) print ('a 保持不變:') print (a)------------------------------ 執行結果: 數組 a: [[10 10][ 2 3][ 4 5]] 創建 a 的深層副本: 數組 b: [[10 10][ 2 3][ 4 5]] 我們能夠寫入 b 來寫入 a 嗎? False 修改 b 的內容: 修改后的數組 b: [[100 10][ 2 3][ 4 5]] a 保持不變: [[10 10][ 2 3][ 4 5]]2、淺拷貝
import numpy as np a = np.arange(6) print ('我們的數組是:') print (a) print ('調用 id() 函數:') print (id(a)) print ('a 賦值給 b:') b = a print (b) print ('b 擁有相同 id():') print (id(b)) print ('修改 b 的形狀:') b.shape = 3,2 print (b) print ('a 的形狀也修改了:') print (a)----------------------------------------- 執行結果: 我們的數組是: [0 1 2 3 4 5] 調用 id() 函數: 4640120544 a 賦值給 b: [0 1 2 3 4 5] b 擁有相同 id(): 4640120544 修改 b 的形狀: [[0 1][2 3][4 5]] a 的形狀也修改了: [[0 1][2 3][4 5]]NumPy 線性代數
NumPy 提供了線性代數函數庫 linalg,該庫包含了線性代數所需的所有功能。
1、numpy.dot() 對于兩個一維的數組,計算的是這兩個數組對應下標元素的乘積和(數學上稱之為內積);對于二維數組,計算的是兩個數組的矩陣乘積
import numpy.matlib import numpy as npa = np.array([[1,2],[3,4]]) b = np.array([[11,12],[13,14]]) print(np.dot(a,b))------------------------------------- 執行結果: [[37 40][85 92]]2、numpy.vdot() 函數是兩個向量的點積。 如果第一個參數是復數,那么它的共軛復數會用于計算。 如果參數是多維數組,它會被展開
import numpy as np a = np.array([[1,2],[3,4]]) b = np.array([[11,12],[13,14]]) # vdot 將數組展開計算內積 print (np.vdot(a,b))----------------------- 執行結果: 1303、numpy.inner() 函數返回一維數組的向量內積。對于更高的維度,它返回最后一個軸上的和的乘積
import numpy as np print (np.inner(np.array([1,2,3]),np.array([0,1,0])))--------------------- 執行結果: 24、numpy.matmul() 函數返回兩個數組的矩陣乘積
import numpy.matlib import numpy as np a = [[1,0],[0,1]] b = [[4,1],[2,2]] print (np.matmul(a,b))------------------------------ 執行結果: [[4 1][2 2]]5、numpy.linalg.det() 函數計算輸入矩陣的行列式
import numpy as np a = np.array([[1,2], [3,4]]) print (np.linalg.det(a))--------------------- 執行結果: -2.00000000000000046、numpy.linalg.solve() 函數給出了矩陣形式的線性方程的解
總結
以上是生活随笔為你收集整理的学习笔记——Numpy基本操作(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt CheckBox的使用
- 下一篇: 学习笔记(十五)——MySQL(查询)