天天看點

python進階—numpy進階(一)

内容:矩陣mat、通用函數、除法、線性計算等

1、矩陣

import numpy as np

# 建立矩陣
print("####建立矩陣####")
a = np.mat("1 2 3;4 5 6")  # 通過str建立
b = np.mat(np.arange(10).reshape(5,2))  # 通過ndarray建立
c = np.matrix(np.arange(6).reshape(3,2))  # matrix函數建立

# 矩陣的屬性
print("####矩陣的屬性####")
transpose_a = a.transpose  # 矩陣轉置
transpose_a2 = a.T  # 矩陣轉置
inverse_a = a.I  # 矩陣的逆
base_array_a = a.A # 基于矩陣的數組
hermitian_a = a.H  # 共轭元素矩陣

# 矩陣的方法
print("####矩陣的方法####")
a.all()  # 沿給定的軸判斷矩陣中所有元素是否為真(0:假,1:真) true
a.any()  # 沿給定的軸判斷矩陣中任意元素是否為真,隻要有一個不等于0即為真 true
a.argmax()  # 沿給定的軸傳回矩陣中最大元素的索引 5
a.argmin()  # 沿給定軸傳回矩陣中最小元素的索引 0
arr = np.array([[0, 4, 2], [0, 0, 5]])
arr.argsort()  # 傳回從小到大排序後的索引矩陣 [[0 2 1],[1 0 2]]
a.astype("float")  # 更改矩陣中元素的資料類型
a.clip(1, 2)  # 傳回新的矩陣,比給定元素大的元素為2,比給定元素小的為1 [[1 2 2],[2 2 2]]
arr2 = a.copy()  # 複制一個矩陣給另一個對象
a.cumsum()  # 沿指定軸累計求和(保留中間解果)[1 3 6 10 15 21]
a.cumprod()  # 沿指定軸累計求積
a.diagonal()  # 傳回對角線元素([1,5])
np.dot(a.T, b)  # 矩陣點乘
a.dump(r"C:\Users\67505\Desktop\建立文本文檔.txt")  # 将矩陣存儲為指定檔案
a.dumps()  # 将矩陣的資料轉換成字元串
a.fill(10)  # 将矩陣中所有元素填充為指定的value
a.getA()  # 傳回自己(ndarray)
a.getA1()  # 傳回扁平的一維數組
a.getT()  # 傳回轉置矩陣
a.getI()  # 傳回逆矩陣
a.getH()  # 傳回共轭矩陣
a.max(axis=1)  # 傳回指定軸的最大值
a.min()  # 傳回指定軸的最小值
a.mean()  # 傳回指定軸的平均值
arr.nonzero()  # 傳回非零元素的索引矩陣
a.prod()  # 傳回矩陣元素的乘積 1000000
a.ptp()  # 指定軸方向最大值減去最小值
a.put([0, 1, 4], [1, 2, 8])  # 用給定的value替換矩陣指定索引對應的元素
a.repeat(3, axis=1)  # 重複矩陣中的每個元素,跨列
a.reshape((3, 2))  # 更改矩陣形狀(拷貝)
a.resize((3, 2))  # 更改矩陣形狀(視圖)
a.sort()  # 對矩陣進行排序(視圖)
a.std()
a.sum()
a.swapaxes(0, 1)  # 交換兩個軸方向上的資料
a.take([1, 2, 3])  # 提取指定索引位置的資料
a.trace()
a.transpose()
a.var()
a.view()  # 傳回視圖
           

2、通用函數ufunc

        ufunc函數對象本身還有一些方法,這些方法隻對兩個輸入,一個輸出的ufunc函數有效,其他的ufunc對象調用這些方法會抛出valueError異常。

a = np.array([[1, 2, 3], [4, 5, 6]])
#  累計reduce()
np.add.reduce(a)  # [5 7 9] 預設axis=0
np.add.reduce(a, axis=1)  # [6,15]
#  累計accmulate(),保留中間計算結果
np.add.accumulate(a, axis=1)  # array([[1,3,6],[4,9,15]])
#  累計reduceat()
#  [1,2,3,3] a[0]=1,a[1]=2,a[0]+a[1]=3,a[2]=3
np.add.reduceat(np.array([1, 2, 3]), indices=[0, 1, 0, 2])
#  outer()對其兩個參數數組的每兩個元素的組合進行計算
'''
*| 2  3  4 
-----------
1| 2  3  4
2| 4  6  8
3| 6  9 12
4| 8 12 16
5|10 15 20
'''
np.multiply.outer([1,2,3,4,5],[2,3,4])
           

3、數組的除法運算(divide,true_divide,floor_division)

a = np.array([2, 6, 5])
b = np.array([1, 2, 3])
# divide和true_divide與數學中的除法定義接近,傳回除法的浮點數結果(numpy version 1.13.3)
np.divide(a, b)  # [ 2.          3.          1.66666667]
np.true_divide(a, b)  # [ 2.          3.          1.66666667]
# floor_divide保留結果中的整數部分
np.floor_divide(a, b)  # [2 3 1]
           

     計算數組的餘數(mod,remainder,fmod)

# 計算餘數
a = np.arange(-4, 4)
# remainder函數逐個傳回兩個數組中元素相除後的餘數,整除傳回0
np.remainder(a, 2)  # [0 1 0 1 0 1 0 1]
# mod與remainder功能一緻
np.mod(a, 2)  # [0 1 0 1 0 1 0 1]
# %為remainder的簡寫
print(a % 2)
# fmod函數處理負數不同,餘數的正負号由被除數決定
print(np.fmod(a, 2))  # [ 0 -1  0 -1  0  1  0  1]
           

4、線性代數

        線性代數是數學的一個重要分支,numpy.linalg子產品包含線性代數的函數,使用這個子產品可以計算矩陣的逆、特征值、求解線性方程組、求解行列式

    4.1、求解矩陣的逆

print("####線性代數####")
matrix_a = np.mat(np.array([[1, 2, 3], [6, 4, 3], [2, 3, 4]]))
# 計算矩陣的逆
inverse_a1 = matrix_a.I
inverse_a2 = np.linalg.inv(matrix_a)
           

4.2、求解線性方程組

import numpy as np

# 解線性方程組
matrix_a = np.mat(np.array([[1, 2, 3], [6, 4, 3], [2, 3, 4]]))
b = np.array([0, 8, 3])
#使用solve函數求解齊次線性方程組
x = np.linalg.solve(matrix_a, b)
print(x)  # [-10.  29. -16.]
           

4.3、求解特征值和特征向量

         求解Ax=λx中的特征值λ和特征向量x,eigvals函數可以計算矩陣的特征值,eigvals求解矩陣的特征值,eig求解包含特征值和特征向量的元組

matrix_a = np.mat(np.array([[1, 2, 3], [6, 4, 3], [2, 3, 4]]))
b = np.array([0, 8, 3])
# 求解特征值
eigvals_a = np.linalg.eigvals(matrix_a)
# 求解特征向量和特征值
eig_a = np.linalg.eig(matrix_a)
           

4.4、奇異值分解

# 奇異值分解
U, Sigma, V = np.linalg.svd(matrix_a, full_matrices=False)
print(U, Sigma, V)
# 奇異值矩陣
sigma_matrix = np.diag(Sigma)
           

繼續閱讀