python---numpy

一 概述

  NumPy 是一個 Python 包。 它表明 「Numeric Python」。 它是一個由多維數組對象和用於處理數組的例程集合組成的庫。Numeric,即 NumPy 的前身,是由 Jim Hugunin 開發的。 他也開發了另外一個包 Numarray ,它擁有一些額外的功能。 2005年,Travis Oliphant 經過將 Numarray 的功能集成到 Numeric 包中來建立 NumPy 包。 這個開源項目有不少貢獻者。html

NumPy是高性能科學計算和數據分析的基礎包。部分功能以下:python

  • ndarray, 具備矢量算術運算和複雜廣播能力的快速且節省空間的多維數組。
  • 用於對整組數據進行快速運算的標準數學函數(無需編寫循環)。
  • 用於讀寫磁盤數據的工具以及用於操做內存映射文件的工具。
  • 線性代數、隨機數生成以及傅里葉變換功能。
  • 用於集成C、C++、Fortran等語言編寫的代碼的工具。

二 建立矩陣

  NumPy 中定義的最重要的對象是稱爲 ndarray 的 N 維數組類型。 它描述相同類型的元素集合。 可使用基於零的索引訪問集合中的項目。ndarray中的每一個元素在內存中使用相同大小的塊。 ndarray中的每一個元素是數據類型對象的對象(稱爲 dtype)。從ndarray對象提取的任何元素(經過切片)由一個數組標量類型的 Python 對象表示。 下圖顯示了ndarray,數據類型對象(dtype)和數組標量類型之間的關係。數組

 

基本的ndarray是使用 NumPy 中的數組函數建立的,以下所示:函數

numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)

上面的構造器接受如下參數:工具

序號 參數及描述
1. object 任何暴露數組接口方法的對象都會返回一個數組或任何(嵌套)序列。
2. dtype 數組的所需數據類型,可選。
3. copy 可選,默認爲true,對象是否被複制。
4. order C(按行)、F(按列)或A(任意,默認)。
5. subok 默認狀況下,返回的數組被強制爲基類數組。 若是爲true,則返回子類。
6. ndimin 指定返回數組的最小維數。

看看下面的例子來更好地理解。性能

import numpy as np #引入numpy庫

#建立一維的ndarray對象
a = np.array([1,2,3,4,5]) #建立二維的ndarray對象
a2 = np.array([[1,2,3,4,5],[6,7,8,9,10]]) #建立多維對象以其類推

三 獲取矩陣行列數(二維狀況)

要獲取ndarray對象的各維的長度,能夠經過narray對象的shape屬性。spa

import numpy as np a = np.array([[1,2,3,4,5],[6,7,8,9,10]]) print(a.shape) #結果返回一個tuple元組 (2, 5)
print(a.shape[0]) #得到行數,返回 2
print(a.shape[1]) #得到列數,返回 5

四 矩陣的截取

4.1 按行列截取

矩陣的截取和list相同,能夠經過[](方括號)來截取.net

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]) #截取第二行,第3、4、五列,返回 [8 9 10]

print(a[1,:])     #截取第二行,返回 [ 6 7 8 9 10]

4.2 按條件截取

按條件截取實際上是在[](方括號)中傳入自身的布爾語句。例如code

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的元素變成1。htm

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] = 1
print(a) #大於6的值改成1後矩陣爲
[[1 2 3 4 5] [6 1 1 1 1]]

五 矩陣的合併

矩陣的合併能夠經過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對象的函數,能夠很方便的建立經常使用的或有規律的矩陣。

(1)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]

(2)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.        ]

(3)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.  ]

假如,咱們想要改變基數,不讓它以10爲底數,咱們能夠改變base參數,將其設置爲2試試。

a = np.logspace(0,9,10,base=2) print(a) >>>array([ 1.,   2.,   4.,   8.,  16.,  32.,  64., 128., 256., 512.])

(4) ones、zeros、eye、empty

新的ndarray對象能夠經過任何下列數組建立例程或使用低級ndarray構造函數構造。

  • 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 =lnp.empty((3,4),dtype=int) # 建立3*4的空矩陣 
print(a_empty) # 結果
[[-1431655765 1073392298 -1431655765 1074440874]
[ 0 1075052544 -1431655765 1075489450]
[-1431655765 1075882666 0 1076101120]]

(5)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] 

(6)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開始的

(7)meshgrid

meshgrid函數一般使用在數據的矢量化上。它適用於生成網格型數據,能夠接受兩個一維數組生成兩個二維矩陣,對應兩個數組中全部的(x,y)對。

import numpy as np

x = np.arange(-2,2)#-2,-1,0,1
y = np.arange(0,3) #生成一位數組,其實也就是向量 0,1,2

z,s = np.meshgrid(x,y)#將兩個一維數組變爲二維矩陣

z
array([[-2, -1,  0,  1],
       [-2, -1,  0,  1],
       [-2, -1,  0,  1]])
s
array([[0, 0, 0, 0],
       [1, 1, 1, 1],
       [2, 2, 2, 2]])

#同理
z,s = np.meshgrid(y,x)#將兩個一維數組變爲二維矩陣

z
array([[0, 1, 2],
       [0, 1, 2],
       [0, 1, 2],
       [0, 1, 2]])
s
array([[-2, -2, -2],
       [-1, -1, -1],
       [ 0,  0,  0],
       [ 1,  1,  1]])

 由上面的示例展現能夠看出,meshgrid的做用是:

根據傳入的兩個一維數組參數生成兩個數組元素的列表。

若是第一個參數是xarray,維度是xdimesion,

第二個參數是yarray,維度是ydimesion。

那麼生成的第一個二維數組是以xarray爲行,共ydimesion行的向量;

而第二個二維數組是以yarray的轉置爲列,共xdimesion列的向量。

七 矩陣的運算

7.1 經常使用矩陣運算符

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.66666667 1.         1.5 ] [0.33333333 1.         3. ]] print(a1%a2) # 相除取餘數 # 結果
[[4 0 2] [1 0 0]]

7.2 經常使用矩陣函數

一樣地,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)) # 結果
[[1.57079633 nan nan] [ nan nan nan]]

當矩陣中的元素不在定義域範圍內,會產生RuntimeWarning,結果爲nan(not a number)。

7.3 矩陣乘法(點乘)

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

7.4 矩陣的轉置

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

7.5 矩陣的逆

求矩陣的逆須要先導入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.]]

八 矩陣信息的獲取

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

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

8.3 方差

方差的函數爲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]

8.4 標準差

標準差的函數爲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]

8.5 中值

  中值指的是將序列按大小順序排列後,排在中間的那個值,若是有偶數個數,則是排在中間兩個數的平均值。例如序列[5,2,6,4,2],按大小順序排成 [2,2,4,5,6],排在中間的數是4,因此這個序列的中值是4。又如序列[5,2,6,4,3,2],按大小順序排成 [2,2,3,4,5,6],由於有偶數個數,排在中間兩個數是三、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.]

8.6 求和

矩陣求和的函數是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]

8.7 累積和

  某位置累積和指的是該位置以前(包括該位置)全部元素的和。例如序列[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]]

參考:

https://www.cnblogs.com/smallpi/p/4550361.html

https://blog.csdn.net/a373595475/article/details/79580734

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息