天天看點

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]]      

 矩陣的逆 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]]