Python學習(四)數組和矩陣


參考資料:

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  #矩陣指數表示矩陣連乘

 


免責聲明!

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



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