1. 程式人生 > 程式設計 >Numpy中對向量、矩陣的使用詳解

Numpy中對向量、矩陣的使用詳解

在下面的程式碼裡面,我們利用numpy和scipy做了很多工作,每一行都有註釋,講解了對應的向量/矩陣操作。

歸納一下,下面的程式碼主要做了這些事:

  • 建立一個向量
  • 建立一個矩陣
  • 建立一個稀疏矩陣
  • 選擇元素
  • 展示一個矩陣的屬性
  • 對多個元素同時應用某種操作
  • 找到最大值和最小值
  • 計算平均值、方差和標準差
  • 矩陣變形
  • 轉置向量或矩陣
  • 展開一個矩陣
  • 計算矩陣的秩
  • 計算行列式
  • 獲取矩陣的對角線元素
  • 計算矩陣的跡
  • 計算特徵值和特徵向量
  • 計算點積
  • 矩陣的相加相減
  • 矩陣的乘法
  • 計算矩陣的逆

一起來看程式碼吧:

# 載入numpy庫
import numpy as np

from scipy import sparse

# 建立一個一維陣列表示一個行向量
vector_row = np.array([1,2,3])

# 建立一個一維陣列表示一個列向量
vector_column = np.array([[1],[2],[3]])

# 建立一個二維陣列表示一個矩陣
matrix1 = np.array([[1,2],[1,2]])

# 利用Numpy內建矩陣資料結構
matrix1_object = np.mat([[1,2]])

# 建立一個新的矩陣
matrix2 = np.array([[0,0],[0,1],[3,0]])

# 建立一個壓縮的稀疏行(CSR)矩陣
matrix2_sparse = sparse.csc_matrix(matrix2)

# 檢視稀疏矩陣
print(matrix2_sparse)

# 建立一個更大的矩陣
matrix_large = np.array([[0,1,0]])

# 建立一個CSR矩陣
matrix_large_sparse = sparse.csr_matrix(matrix_large)

# 檢視更大的稀疏矩陣
print(matrix_large_sparse)

# 建立一個行向量
vector = np.array([1,3,4,5,6])

# 建立矩陣
matrix_vector = np.array([[1,3],[4,6],[7,8,9]])

# 選擇向量的第三個元素
print(vector[2])

# 選擇第二行第二列
print(matrix_vector[1,1])

# 選取一個向量的所有元素
print(vector[:])

# 選取從0開始一直到第3個(包含第3個)元素
print(vector[:3])

# 選取第3個元素之後的全部元素
print(vector[3:])

# 選取最後一個元素
print(vector[-1])

# 選取矩陣的第1行和第2行以及所有列
print(matrix_vector[:2,:])

# 選取所有行以及第2列
print(matrix_vector[:,1:2])

# 選取所有行以及第2列並轉換成一個新的行向量
print(matrix_vector[:,1])

# 建立新的矩陣
matrix3 = np.array([[1,4],[5,6,7,8],[9,10,11,12]])

# 檢視行數和列數
print(matrix3.shape)

# 檢視元素數量
print(matrix3.size)

# 檢視維數
print(matrix3.ndim)

# 下面使用的矩陣是matrix_vector
# 建立一個匿名函式,返回輸入值加上100以後的值
add_100 = lambda i: i+100

# 建立向量轉化函式
vectorized_add_100 = np.vectorize(add_100)

# 對矩陣的所有元素應用這個函式
print(vectorized_add_100(matrix_vector))

# 用後矩陣本身不變
print(matrix_vector)

# 連續使用
print(vectorized_add_100(vectorized_add_100(matrix_vector)))

# 返回最大的元素
print(np.max(matrix_vector))

# 返回最小元素
print(np.min(matrix_vector))

# 找到每一列的最大元素
print(np.max(matrix_vector,axis=0))

# 找到每一行最大的元素
print(np.max(matrix_vector,axis=1))

# 返回平均值
print(np.mean(matrix_vector))

# 返回方差
print(np.var(matrix_vector))

# 返回標準差
print(np.std(matrix_vector))

# 求每一列的平均值
print(np.mean(matrix_vector,axis=0))

# 求每一行的方差
print(np.var(matrix_vector,axis=1))

# 將matrix3矩陣變為2×6矩陣
matrix4 = matrix3.reshape(2,6)
print(matrix4)

# 上面的變形要求前後元素個數相同,且不會改變元素個數
print(matrix4.size)

# reshape時傳入引數-1意味著可以根據需要填充元素
print(matrix3.reshape(1,-1))

# reshape如果提供一個整數,那麼reshape會返回一個長度為該整數值的一維陣列
print(matrix3.reshape(12))

# 轉置matrix_vector矩陣
print(matrix_vector.T)

# 嚴格地講,向量是不能被轉置的
print(vector.T)

# 轉置向量通常指二維陣列表示形式下將行向量轉換為列向量或者反向轉換
print(np.array([[1,6]]).T)

# 將matrix_vector矩陣展開
print(matrix_vector.flatten())

# 將矩陣展開的另一種策略是利用reshape建立一個行向量
print(matrix_vector.reshape(1,-1))

# 建立用於求秩的新矩陣
matrix5 = np.array([[1,10],15]])

# 計算矩陣matrix5的秩
print(np.linalg.matrix_rank(matrix5))

# 建立用於行列式求解的新矩陣
matrix6 = np.array([[1,[2,9]])

# 求解矩陣matrix6的行列式
print(np.linalg.det(matrix6))

# 返回矩陣的對角線元素
print(matrix6.diagonal())

# 返回主對角線向上偏移量為1的對角線元素
print(matrix6.diagonal(offset=1))

# 返回主對角線向下偏移量為1的對角線元素
print(matrix6.diagonal(offset=-1))

# 返回矩陣的跡
print(matrix6.trace())

# 求跡的另外的方法(返回對角線元素並求和)
print(sum(matrix6.diagonal()))

# 建立一個求解特徵值、特徵向量的矩陣
matrix7 = np.array([[1,-1,9]])

# 計算特徵值和特徵向量
eigenvalues,eigenvectors = np.linalg.eig(matrix7)

# 檢視特徵值
print(eigenvalues)

# 檢視特徵向量
print(eigenvectors)

# 構造兩個點積(數量積)所需向量
vector_a = np.array([1,3])
vector_b = np.array([4,6])

# 計算點積
print(np.dot(vector_a,vector_b))

# Python 3.5+ 版本可以這樣求解點積
print(vector_a @ vector_b)

# 構造兩個可用於加減的矩陣
matrix_a = np.array([[1,2]])
matrix_b = np.array([[1,8]])

# 兩矩陣相加
print(np.add(matrix_a,matrix_b))

# 兩矩陣相減
print(np.subtract(matrix_a,matrix_b))

# 直接用+/-也可以做矩陣加減
print(matrix_a + matrix_b)
print(matrix_a - matrix_b)

# 構造兩個可用於乘法的小矩陣
matrix_c = np.array([[1,2]])
matrix_d = np.array([[1,2]])

# 兩矩陣相乘
print(np.dot(matrix_c,matrix_d))

# Python 3.5+ 版本可以這樣求解矩陣乘法
print(matrix_c @ matrix_d)

# 我們也可以把兩矩陣對應元素相乘,而非矩陣乘法
print(matrix_c * matrix_d)

# 建立一個用於求逆的矩陣
matrix8 = np.array([[1,5]])

# 計算矩陣的逆
print(np.linalg.inv(matrix8))

# 驗證一個矩陣和它的逆矩陣相乘等於I(單位矩陣)
print(matrix8 @ np.linalg.inv(matrix8))

測試結果:

(2,0)3
(1,1)1
(1,1)1
(2,0)3
3
5
[1 2 3 4 5 6]
[1 2 3]
[4 5 6]
6
[[1 2 3]
[4 5 6]]
[[2]
[5]
[8]]
[2 5 8]
(3,4)
12
2
[[101 102 103]
[104 105 106]
[107 108 109]]
[[1 2 3]
[4 5 6]
[7 8 9]]
[[201 202 203]
[204 205 206]
[207 208 209]]
9
1
[7 8 9]
[3 6 9]
5.0
6.666666666666667
2.581988897471611
[4. 5. 6.]
[0.66666667 0.66666667 0.66666667]

[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]]
12
[[ 1 2 3 4 5 6 7 8 9 10 11 12]]
[ 1 2 3 4 5 6 7 8 9 10 11 12]
[[1 4 7]
[2 5 8]
[3 6 9]]
[1 2 3 4 5 6]
[[1]
[2]
[3]
[4]
[5]
[6]]
[1 2 3 4 5 6 7 8 9]
[[1 2 3 4 5 6 7 8 9]]
2
0.0
[1 4 9]
[2 6]
[2 8]
14
14
[13.55075847 0.74003145 -3.29078992]
[[-0.17622017 -0.96677403 -0.53373322]
[-0.435951 0.2053623 -0.64324848]
[-0.88254925 0.15223105 0.54896288]]
32
32
[[ 2 4 2]
[ 2 4 2]
[ 2 4 10]]
[[ 0 -2 0]
[ 0 -2 0]
[ 0 -2 -6]]
[[ 2 4 2]
[ 2 4 2]
[ 2 4 10]]
[[ 0 -2 0]
[ 0 -2 0]
[ 0 -2 -6]]
[[2 5]
[3 7]]
[[2 5]
[3 7]]
[[1 3]
[1 4]]
[[-1.66666667 1.33333333]
[ 0.66666667 -0.33333333]]
[[1.00000000e+00 0.00000000e+00]
[1.11022302e-16 1.00000000e+00]]

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。