Python numpy模塊常用方法
文章轉載自:https://www.zybuluo.com/Frankchen/note/338294
python
創建矩陣(採用ndarray對象)
對於python中的numpy模塊,一般用其提供的ndarray對象。
創建一個ndarray對象很簡單,只要將一個list作爲參數即可。
例如
import numpy as np #引入numpy庫
#創建一維的narray對象
a = np.array([1,2,3,4,5])
#創建二維的narray對象
a2 = np.array([[1,2,3,4,5],[6,7,8,9,10]])
#創建多維對象以其類推
獲取矩陣行數列數(二維情況)
習慣了採用matlab進行數模的編程,要對矩陣進行遍歷時,一般先獲取矩陣的行數和列數。要獲取narray對象的各維的長度,可以通過narray對象的shape屬性
import numpy as np
a = np.array([[1,2,3,4,5],[6,7,8,9,10]])
print(a.shape) #結果返回一個tuple元組 (2L, 5L)
print(a.shape[0]) #獲得行數,返回 2
print(a.shape[1]) #獲得列數,返回 5
矩陣的截取
按行列截取
矩陣的截取和list相同,可以通過[](方括號)來截取
import numpy as np
a = np.array([[1,2,3,4,5],[6,7,8,9,10]])
print(a[0:1]) #截取第一行,返回 [[1 2 3 4 5]]
print(a[1,2:5]) #截取第二行,第三、四列,返回 [8 9]
print(a[1,:]) #截取第二行,返回 [ 6 7 8 9 10]
按條件截取
按條件截取其實是在[](方括號)中傳入自身的布爾語句
例如
import numpy as np
a = np.array([[1,2,3,4,5],[6,7,8,9,10]])
b = a[a>6] # 截取矩陣a中大於6的元素,範圍的是一維數組
print(b) # 返回 [ 7 8 9 10]
# 其實布爾語句首先生成一個布爾矩陣,將布爾矩陣傳入[](方括號)實現截取
print(a>6)
# 返回
[[False False False False False]
[False True True True True]]
按條件截取應用較多的是對矩陣中滿足一定條件的元素變成特定的值。
例如將矩陣中大於6的元素變成0。
import numpy as np
a = np.array([[1,2,3,4,5],[6,7,8,9,10]])
print(a)
#開始矩陣爲
[[ 1 2 3 4 5]
[ 6 7 8 9 10]]
a[a>6] = 0
print(a)
#大於6清零後矩陣爲
[[1 2 3 4 5]
[6 0 0 0 0]]
矩陣的合併
矩陣的合並可以通過numpy中的hstack方法和vstack方法實現
import numpy as np
a1 = np.array([[1,2],[3,4]])
a2 = np.array([[5,6],[7,8]])
#!注意 參數傳入時要以列表list或元組tuple的形式傳入
print(np.hstack([a1,a2]))
#橫向合併,返回結果如下
[[1 2 5 6]
[3 4 7 8]]
print(np.vstack((a1,a2)))
#縱向合併,返回結果如下
[[1 2]
[3 4]
[5 6]
[7 8]]
矩陣的合併也可以通過concatenatef方法。 np.concatenate( (a1,a2), axis=0 )
等價於 np.vstack( (a1,a2) )
np.concatenate( (a1,a2), axis=1 )
等價於 np.hstack( (a1,a2) )
通過函數創建矩陣
numpy模塊中自帶了一些創建ndarray對象的函數,可以很方便的創建常用的或有規律的矩陣。
import numpy as np
a = np.arange(10) # 默認從0開始到10(不包括10),步長爲1
print(a) # 返回 [0 1 2 3 4 5 6 7 8 9]
a1 = np.arange(5,10) # 從5開始到10(不包括10),步長爲1
print(a1) # 返回 [5 6 7 8 9]
a2 = np.arange(5,20,2) # 從5開始到20(不包括20),步長爲2
print(a2) # 返回 [ 5 7 9 11 13 15 17 19]
linspace
linspace()和matlab的linspace很類似,用於創建指定數量等間隔的序列,實際生成一個等差數列。
import numpy as np
a = np.linspace(0,10,7) # 生成首位是0,末位是10,含7個數的等差數列
print(a)
# 結果
[ 0. 1.66666667 3.33333333 5. 6.66666667 8.33333333 10. ]
logspace
linspace用於生成等差數列,而logspace用於生成等比數列。
下面的例子用於生成首位是100,末位是102,含5個數的等比數列。
import numpy as np
a = np.logspace(0,2,5)
print(a)
# 結果
[ 1. 3.16227766 10. 31.6227766 100. ]
ones、zeros、eye、empty
ones創建全1矩陣
zeros創建全0矩陣
eye創建單位矩陣
empty創建空矩陣(實際有值)
import numpy as np
a_ones = np.ones((3,4)) # 創建3*4的全1矩陣
print(a_ones)
# 結果
[[ 1. 1. 1. 1.]
[ 1. 1. 1. 1.]
[ 1. 1. 1. 1.]]
a_zeros = np.zeros((3,4)) # 創建3*4的全0矩陣
print(a_zeros)
# 結果
[[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]]
a_eye = np.eye(3) # 創建3階單位矩陣
print(a_eye)
# 結果
[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 0. 1.]]
a_empty = np.empty((3,4)) # 創建3*4的空矩陣
print(a_empty)
# 結果
[[ 1.78006111e-306 -3.13259416e-294 4.71524461e-309 1.94927842e+289]
[ 2.10230387e-309 5.42870216e+294 6.73606381e-310 3.82265219e-297]
[ 6.24242356e-309 1.07034394e-296 2.12687797e+183 6.88703165e-315]]
fromstring
fromstring()方法可以將字符串轉化成ndarray對象,需要將字符串數字化時這個方法比較有用,可以獲得字符串的ascii碼序列。
a = "abcdef"
b = np.fromstring(a,dtype=np.int8) # 因爲一個字符爲8爲,所以指定dtype爲np.int8
print(b) # 返回 [ 97 98 99 100 101 102]
fromfunction
fromfunction()方法可以根據矩陣的行號列號生成矩陣的元素。
例如創建一個矩陣,矩陣中的每個元素都爲行號和列號的和。
import numpy as np
def func(i,j):
return i+j
a = np.fromfunction(func,(5,6))
# 第一個參數爲指定函數,第二個參數爲列表list或元組tuple,說明矩陣的大小
print(a)
# 返回
[[ 0. 1. 2. 3. 4. 5.]
[ 1. 2. 3. 4. 5. 6.]
[ 2. 3. 4. 5. 6. 7.]
[ 3. 4. 5. 6. 7. 8.]
[ 4. 5. 6. 7. 8. 9.]]
#注意這裏行號的列號都是從0開始的
矩陣的運算
常用矩陣運算符
numpy中的ndarray對象重載了許多運算符,使用這些運算符可以完成矩陣間對應元素的運算。
運算符 | 說明 |
---|---|
+ | 矩陣對應元素相加 |
- | 矩陣對應元素相減 |
* | 矩陣對應元素相乘 |
/ | 矩陣對應元素相除,如果都是整數則取商 |
% | 矩陣對應元素相除後取餘數 |
** | 矩陣每個元素都取n次方,如**2:每個元素都取平方 |
import numpy as np
a1 = np.array([[4,5,6],[1,2,3]])
a2 = np.array([[6,5,4],[3,2,1]])
print(a1+a2) # 相加
# 結果
[[10 10 10]
[ 4 4 4]]
print(a1/a2) # 整數相除取商
# 結果
[[0 1 1]
[0 1 3]]
print(a1%a2) # 相除取餘數
# 結果
[[4 0 2]
[1 0 0]]
常用矩陣函數
同樣地,numpy中也定義了許多函數,使用這些函數可以將函數作用於矩陣中的每個元素。
表格中默認導入了numpy模塊,即 import numpy as np
a爲ndarray對象。
矩陣函數 | 說明 |
---|---|
np.sin(a) | 對矩陣a中每個元素取正弦,sin(x) |
np.cos(a) | 對矩陣a中每個元素取餘弦,cos(x) |
np.tan(a) | 對矩陣a中每個元素取正切,tan(x) |
np.arcsin(a) | 對矩陣a中每個元素取反正弦,arcsin(x) |
np.arccos(a) | 對矩陣a中每個元素取反餘弦,arccos(x) |
np.arctan(a) | 對矩陣a中每個元素取反正切,arctan(x) |
np.exp(a) | 對矩陣a中每個元素取指數函數,ex |
np.sqrt(a) | 對矩陣a中每個元素開根號√x |
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print(np.sin(a))
# 結果
[[ 0.84147098 0.90929743 0.14112001]
[-0.7568025 -0.95892427 -0.2794155 ]]
print(np.arcsin(a))
# 結果
C:\Users\Administrator\Desktop\learn.py:6: RuntimeWarning: invalid value encountered in arcsin
print(np.arcsin(a))
[[ 1.57079633 nan nan]
[ nan nan nan]]
當矩陣中的元素不在定義域範圍內,會產生RuntimeWarning,結果爲nan(not a number)。
矩陣乘法(點乘)
矩陣乘法必須滿足矩陣乘法的條件,即第一個矩陣的列數等於第二個矩陣的行數。
矩陣乘法的函數爲 dot
例如
import numpy as np
a1 = np.array([[1,2,3],[4,5,6]]) # a1爲2*3矩陣
a2 = np.array([[1,2],[3,4],[5,6]]) # a2爲3*2矩陣
print(a1.shape[1]==a2.shape[0]) # True, 滿足矩陣乘法條件
print(a1.dot(a2))
# a1.dot(a2)相當於matlab中的a1*a2
# 而python中的a1*a2相當於matlab中的a1.*a2
# 結果
[[22 28]
[49 64]]
矩陣的轉置
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print(a.transpose())
# 結果
[[1 4]
[2 5]
[3 6]]
矩陣的轉置還有更簡單的方法,就是a.T
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print(a.T)
# 結果
[[1 4]
[2 5]
[3 6]]
矩陣的逆 a−1
求矩陣的逆需要先導入numpy.linalg,用linalg的inv函數來求逆。
矩陣求逆的條件是矩陣的行數和列數相同。
import numpy as np
import numpy.linalg as lg
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(lg.inv(a))
# 結果
[[ -4.50359963e+15 9.00719925e+15 -4.50359963e+15]
[ 9.00719925e+15 -1.80143985e+16 9.00719925e+15]
[ -4.50359963e+15 9.00719925e+15 -4.50359963e+15]]
a = np.eye(3) # 3階單位矩陣
print(lg.inv(a)) # 單位矩陣的逆爲他本身
# 結果
[[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 0. 1.]]
矩陣信息獲取(如平均值)
最大最小值
獲得矩陣中元素最大最小值的函數分別是max和min,可以獲得整個矩陣、行或列的最大最小值。
例如
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print(a.max()) #獲取整個矩陣的最大值 結果: 6
print(a.min()) #結果:1
# 可以指定關鍵字參數axis來獲得行最大(小)值或列最大(小)值
# axis=0 行方向最大(小)值,即獲得每列的最大(小)值
# axis=1 列方向最大(小)值,即獲得每行的最大(小)值
# 例如
print(a.max(axis=0))
# 結果爲 [4 5 6]
print(a.max(axis=1))
# 結果爲 [3 6]
# 要想獲得最大最小值元素所在的位置,可以通過argmax函數來獲得
print(a.argmax(axis=1))
# 結果爲 [2 2]
平均值
獲得矩陣中元素的平均值可以通過函數mean()。同樣地,可以獲得整個矩陣、行或列的平均值。
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print(a.mean()) #結果爲: 3.5
# 同樣地,可以通過關鍵字axis參數指定沿哪個方向獲取平均值
print(a.mean(axis=0)) # 結果 [ 2.5 3.5 4.5]
print(a.mean(axis=1)) # 結果 [ 2. 5.]
方差
方差的函數爲var(),方差函數var()相當於函數mean(abs(x - x.mean())**2),其中x爲矩陣。
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print(a.var()) # 結果 2.91666666667
print(a.var(axis=0)) # 結果 [ 2.25 2.25 2.25]
print(a.var(axis=1)) # 結果 [ 0.66666667 0.66666667]
標準差
標準差的函數爲std()。
std()相當於sqrt(mean(abs(x - x.mean())**2)),或相當於sqrt(x.var())。
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print(a.std()) # 結果 1.70782512766
print(a.std(axis=0)) # 結果 [ 1.5 1.5 1.5]
print(a.std(axis=1)) # 結果 [ 0.81649658 0.81649658]
中值
中值指的是將序列按大小順序排列後,排在中間的那個值,如果有偶數個數,則是排在中間兩個數的平均值。
例如序列[5,2,6,4,2],按大小順序排成 [2,2,4,5,6],排在中間的數是4,所以這個序列的中值是4。
又如序列[5,2,6,4,3,2],按大小順序排成 [2,2,3,4,5,6],因爲有偶數個數,排在中間兩個數是3、4,所以這個序列中值是3.5。
中值的函數是median(),調用方法爲numpy.median(x,[axis]),axis可指定軸方向,默認axis=None,對所有數去中值。
import numpy as np
x = np.array([[1,2,3],[4,5,6]])
print(np.median(x)) # 對所有數取中值
# 結果
3.5
print(np.median(x,axis=0)) # 沿第一維方向取中值
# 結果
[ 2.5 3.5 4.5]
print(np.median(x,axis=1)) # 沿第二維方向取中值
# 結果
[ 2. 5.]
求和
矩陣求和的函數是sum(),可以對行,列,或整個矩陣求和
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print(a.sum()) # 對整個矩陣求和
# 結果 21
print(a.sum(axis=0)) # 對行方向求和
# 結果 [5 7 9]
print(a.sum(axis=1)) # 對列方向求和
# 結果 [ 6 15]
累積和
某位置累積和指的是該位置之前(包括該位置)所有元素的和。
例如序列[1,2,3,4,5],其累計和爲[1,3,6,10,15],即第一個元素爲1,第二個元素爲1+2=3,……,第五個元素爲1+2+3+4+5=15。
矩陣求累積和的函數是cumsum(),可以對行,列,或整個矩陣求累積和。
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print(a.cumsum()) # 對整個矩陣求累積和
# 結果 [ 1 3 6 10 15 21]
print(a.cumsum(axis=0)) # 對行方向求累積和
# 結果
[[1 2 3]
[5 7 9]]
print(a.cumsum(axis=1)) # 對列方向求累積和
# 結果
[[ 1 3 6]
[ 4 9 15]]