numpy常用矩陣運算方法【轉】


原文:http://blog.csdn.net/sinat_32547403/article/details/54017551

 目錄:

  1.   獲取矩陣行數列數二維情況
  2.  矩陣的截取 
    1.  按行列截取 
    2.  按條件截取 
  3.  矩陣的合並 
  4.  通過函數創建矩陣 
    1. arange
    2.  linspace 
    3.  logspace 
    4.  ones、zeros、eye、empty
    5.  fromstring 
    6.  fromfunction 
  5.  矩陣的運算 
    1.  常用矩陣運算符 
    2.  常用矩陣函數 
    3.   矩陣乘法點乘
    4.  矩陣的轉置 aT
    5.  矩陣的逆 a1
  6.   矩陣信息獲取如平均值
    1.  最大最小值 
    2.  平均值 
    3.  方差 
    4.  標准差 
    5.  中值 

對於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對象的函數,可以很方便的創建常用的或有規律的矩陣。

arange

復制代碼
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)。

 

[1,1]


  矩陣乘法(點乘)

矩陣乘法必須滿足矩陣乘法的條件,即第一個矩陣的列數等於第二個矩陣的行數。 
矩陣乘法的函數為 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]]
復制代碼

 

 

 矩陣的轉置 aT

復制代碼
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]]
復制代碼

 


 矩陣的逆 a1

求矩陣的逆需要先導入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.]]
復制代碼

 

 

  矩陣信息獲取(如平均值)

 最大最小值 

獲得矩陣中元素最大最小值的函數分別是maxmin,可以獲得整個矩陣、行或列的最大最小值。 
例如

復制代碼
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]]


免責聲明!

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



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