參考資料:
https://github.com/lijin-THU/notes-python(相應實體書為:《自學Python——編程基礎、科學計算及數據分析》)
一、生成數組的函數
1. arange()函數:類似於python中的range()函數,只不過返回的不是列表,而是返回數組
(1)arange(start, stop=None, step=1, dtype=None) //產生一個在區間 [start, stop)
之間(不包括stop),以 step
為間隔的數組,如果只輸入一個參數,則默認從 0
開始,並以這個值為結束,數組類型由dtype指定
(2)與 range
不同, arange
允許非整數值輸入,產生一個非整型的數組:np.arange(0, 2 * np.pi, np.pi / 4) 或 np.arange(0, 2 * np.pi, np.pi / 4, dtype=np.float32)
注:由於存在精度問題,使用浮點數可能出現問題,如 np.arange(1.5, 2.1, 0.3) 返回 array([1.5, 1.8, 2.1]) 終點stop的值2.1出現在數組中
2. linspace()函數:linspace(start, stop, N) 產生 N
個等距分布在 [start, stop]
間的元素組成的數組,包括 start, stop
3. logspace()函數:logspace(start, stop, N) 產生 N 個對數等距分布的數組,默認以10為底
np.logspace(0, 1, 5) //產生的值為$[10^{0}, 10^{0.25}, 10^{0.5}, 10^{0.75}, 10^{1}]$
4. meshgrid()函數:在二維平面生成網格
1 x_ticks = np.linspace(-1, 1, 5) 2 y_ticks = np.linspace(-1, 1, 5) 3 4 x, y = np.meshgrid(x_ticks, y_ticks)
x: array([[-1. , -0.5, 0. , 0.5, 1. ],
[-1. , -0.5, 0. , 0.5, 1. ], [-1. , -0.5, 0. , 0.5, 1. ], [-1. , -0.5, 0. , 0.5, 1. ], [-1. , -0.5, 0. , 0.5, 1. ]])
y: array([[-1. , -1. , -1. , -1. , -1. ],
[-0.5, -0.5, -0.5, -0.5, -0.5], [ 0. , 0. , 0. , 0. , 0. ], [ 0.5, 0.5, 0.5, 0.5, 0.5], [ 1. , 1. , 1. , 1. , 1. ]])
注:可以添加 sparse
的選項以避免冗余,x, y = np.meshgrid(x_ticks, y_ticks, sparse=True) //生成的x、y分別為單一的行向量和列向量
(1)meshgrid
可以設置軸排列的先后順序:
- 默認為
indexing='xy'
即笛卡爾坐標,對於2維數組,返回行向量x
和列向量y
- 或者使用
indexing='ij'
即矩陣坐標,對於2維數組,返回列向量x
和行向量y
(2)matlab中meshgrid用法有:meshgrid(-1:.5,1, -1:.5:1);相應的, 在numpy中使用ogrid和mgrid函數
ogrid
與 mgrid
的區別在於:
ogrid
相當於meshgrid(indexing='ij', sparse=True)
mgrid
相當於meshgrid(indexing='ij', sparse=False)
注:
- 這里使用的是中括號
- Matlab 使用的是
start:step:end
的表示,Numpy 使用的是start:end:step
的表示 - 這里的結果不包括
end
的值
為了包含 end
的值,可以使用這樣的技巧:
x, y = np.ogrid[-1:1:5j, -1:1:5j] //在 step
的位置傳入一個復數 5j
,表示需要一個 5
個值的數組,此時返回值就會包含 end
的值(復數步長指定數組長度)
5. 使用 r_ / c_
來產生行向量或者列向量
1 np.r_[0:1:.1] #使用切片產生行向量 2 np.r_[0:1:5j] #使用復數步長指定數組長度 3 np.r_[(3,22,11), 4.0, [15, 6]] #連接多個序列 4 np.r_[(3,22,11), 4.0, [15, 6]] #列向量
6. 產生全0和全1數組:ones(shape, dtype=float64)、zeros(shape, dtype=float64)
1 np.zeros(3) 2 np.ones([2,3], dtype=np.float32)
3 np.ones([2,3]) * 5 #產生全是5的數組
7. empty()函數:empty(shape, dtype=float64, order='C')
可以使用 empty
方法產生一個指定大小的數組(數組所指向的內存未被初始化,值隨機),再用 fill
方法填充
1 a = np.empty(2) 2 a.fill(5) 3 a[:] = 5 #使用索引方法,速度稍慢一點
8. empty_like(a)、ones_like(a)、zeros_like(a):產生一個跟 a
大小一樣,類型一樣的對應數組
9. identity(n, dtype=float64):產生一個 n
乘 n
的單位矩陣,如 identity(3)
二、矩陣
1. 使用 mat 方法將2維數組轉化為矩陣
1 import numpy as np 2 a = np.array([[1,2,4], 3 [2,5,3], 4 [7,8,9]]) 5 A = np.mat(a) #type(A)
2. 使用 Matlab 的語法傳入一個字符串來生成矩陣
1 A = np.mat('1,2,4;2,5,3;7,8,9')
3. 利用分塊創造新的矩陣
1 a = np.array([[ 1, 2], 2 [ 3, 4]]) 3 b = np.array([[10,20], 4 [30,40]]) 5 6 np.bmat('a,b;b,a')
4. 矩陣與向量乘法、逆矩陣、矩陣連乘
1 A = np.mat('1,2,4;2,5,3;7,8,9') 2 x = np.array([[1], [2], [3]]) 3 A * x #矩陣與向量乘法 4 print(A * A.I) #A.I表示矩陣A的逆矩陣 5 print A ** 4 #矩陣指數表示矩陣連乘