Python 数据分析三剑客之 NumPy(六):矩阵 / 线性代数库与 IO 操作
CSDN 課程推薦:《Python 數據分析與挖掘》,講師劉順祥,浙江工商大學統計學碩士,數據分析師,曾擔任唯品會大數據部擔任數據分析師一職,負責支付環節的數據分析業務。曾與聯想、亨氏、網魚網咖等企業合作多個企業級項目。
NumPy 系列文章:
- Python 數據分析三劍客之 NumPy(一):理解 NumPy / 數組基礎
- Python 數據分析三劍客之 NumPy(二):數組索引 / 切片 / 廣播 / 拼接 / 分割
- Python 數據分析三劍客之 NumPy(三):數組的迭代與位運算
- Python 數據分析三劍客之 NumPy(四):字符串函數總結與對比
- Python 數據分析三劍客之 NumPy(五):數學 / 算術 / 統計 / 排序 / 條件 / 判斷函數合集
- Python 數據分析三劍客之 NumPy(六):矩陣 / 線性代數庫與 IO 操作
另有 Pandas、Matplotlib 系列文章已更新完畢,歡迎關注:
- Pandas 系列文章:https://itrhx.blog.csdn.net/category_9780397.html
- Matplotlib 系列文章:https://itrhx.blog.csdn.net/category_9780418.html
推薦學習資料與網站(博主參與部分文檔翻譯):
- NumPy 官方中文網:https://www.numpy.org.cn/
- Pandas 官方中文網:https://www.pypandas.cn/
- Matplotlib 官方中文網:https://www.matplotlib.org.cn/
- NumPy、Matplotlib、Pandas 速查表:https://github.com/TRHX/Python-quick-reference-table
文章目錄
- 【1x00】NumPy 矩陣庫
- 【1x01】numpy.mat()
- 【1x02】numpy.asmatrix()
- 【1x03】numpy.matrix()
- 【1x04】mat() / asmatrix() / matrix() 的區別
- 【1x05】numpy.bmat()
- 【1x06】numpy.matlib.empty()
- 【1x07】numpy.matlib.zeros()
- 【1x08】numpy.matlib.ones()
- 【1x09】numpy.matlib.eye()
- 【1x10】numpy.matlib.identity()
- 【1x11】numpy.matlib.repmat()
- 【1x12】numpy.matlib.rand()
- 【1x13】numpy.matlib.randn()
- 【2x00】NumPy 線性代數庫
- 【2x01】numpy.dot()
- 【2x02】numpy.vdot()
- 【2x03】numpy.inner()
- 【2x04】numpy.outer()
- 【2x05】numpy.matmul()
- 【2x06】numpy.tensordot()
- 【2x07】numpy.linalg.det()
- 【2x08】numpy.linalg.solve()
- 【2x09】numpy.linalg.inv()
- 【3x00】NumPy IO 操作
- 【3x01】numpy.save()
- 【3x02】numpy.load()
- 【3x03】numpy.savez()
- 【3x04】numpy.savetxt()
- 【3x05】numpy.loadtxt()
- 【3x06】numpy.genfromtxt()
這里是一段防爬蟲文本,請讀者忽略。 本文原創首發于 CSDN,作者 TRHX。 博客首頁:https://itrhx.blog.csdn.net/ 本文鏈接:https://itrhx.blog.csdn.net/article/details/105511641 未經授權,禁止轉載!惡意轉載,后果自負!尊重原創,遠離剽竊!
【1x00】NumPy 矩陣庫
numpy.matlib 模塊是 NumPy 的矩陣庫,該矩陣庫包含多種函數,函數返回的是一個矩陣,而不是 Ndarray 對象。
官方文檔介紹:https://numpy.org/doc/1.18/reference/routines.matlib.html
【1x01】numpy.mat()
numpy.mat() 函數將輸入數組轉換為為矩陣。
基本語法:numpy.mat(data[, dtype=None])
| data | 輸入數據,如果 data 為字符串,則需要用逗號或空格分隔列,用分號分隔行 |
| dtype | 輸出矩陣的數據類型,可選項 |
應用舉例:
>>> import numpy as np >>> a = np.mat([1, 2, 3]) >>> a matrix([[1, 2, 3]]) >>> a[0] matrix([[1, 2, 3]]) >>> a[0,1] 2 >>> import numpy as np >>> a = np.array([[1, 2], [3, 4]]) >>> a array([[1, 2],[3, 4]]) >>> b = np.mat(a) >>> b matrix([[1, 2],[3, 4]])【1x02】numpy.asmatrix()
numpy.asmatrix() 函數將輸入數組轉換為為矩陣。
基本語法:numpy.asmatrix(data[, dtype=None])
| data | 輸入數據,如果 data 為字符串,則需要用逗號或空格分隔列,用分號分隔行 |
| dtype | 輸出矩陣的數據類型,可選項 |
應用舉例:
>>> import numpy as np >>> a = np.array([[1, 2], [3, 4]]) >>> np.asmatrix(a) matrix([[1, 2],[3, 4]])【1x03】numpy.matrix()
numpy.matrix() 函數從類似數組的對象或數據字符串中返回一個矩陣。
注意:此函數已經不建議再使用,在未來的版本當中可能會被刪除。
基本語法:class numpy.matrix(data[, dtype=None, copy=True])
| data | 數組或者字符串,如果 data 為字符串,則需要用逗號或空格分隔列,用分號分隔行 |
| dtype | 輸出矩陣的數據類型,可選項 |
| copy | 是否復制數據到一個新矩陣,可選項 |
應用舉例:
>>> import numpy as np >>> a = np.matrix('1 2; 3 4') >>> a matrix([[1, 2],[3, 4]]) >>> >>> b = np.matrix([[1, 2], [3, 4]]) >>> b matrix([[1, 2],[3, 4]])【1x04】mat() / asmatrix() / matrix() 的區別
如果輸入已經是一個矩陣或一個數組,則 mat() 和 asmatrix() 函數不會執行復制操作,相當于 matrix(data, copy=False)
對比舉例:
>>> import numpy as np >>> a = np.array([[1, 2], [3, 4]]) >>> b = np.mat(a) >>> c = np.matrix(a) >>> d = np.asmatrix(a) >>> >>> a array([[1, 2],[3, 4]]) >>> b matrix([[1, 2],[3, 4]]) >>> c matrix([[1, 2],[3, 4]]) >>> d matrix([[1, 2],[3, 4]]) >>> >>> a[1][1] = 0 >>> >>> a array([[1, 2],[3, 0]]) >>> b matrix([[1, 2],[3, 0]]) >>> c # matrix() 函數默認執行 copy 操作,所以數據不變 matrix([[1, 2],[3, 4]]) >>> d matrix([[1, 2],[3, 0]])【1x05】numpy.bmat()
numpy.bmat() 函數用于從字符串、嵌套序列或數組生成矩陣對象,一般用于創建復合矩陣。
基本語法:numpy.bmat(obj[, ldict=None, gdict=None])
| obj | 數組或者字符串,如果 data 為字符串,則需要用逗號或空格分隔列,用分號分隔行 |
| ldict | 字典,用于替換當前幀中的本地操作數。如果 obj 不是字符串或 gdict 為 None,則將被忽略 |
| gdict | 字典,用于替換當前幀中的全局操作數。如果 obj 不是字符串則忽略 |
應用舉例:
>>> import numpy as np >>> a = np.mat('1 1; 1 1') >>> b = np.mat('2 2; 2 2') >>> c = np.mat('3 4; 5 6') >>> d = np.mat('7 8; 9 0') >>> >>> np.bmat([[a, b], [c, d]]) matrix([[1, 1, 2, 2],[1, 1, 2, 2],[3, 4, 7, 8],[5, 6, 9, 0]]) >>> np.bmat(np.r_[np.c_[a, b], np.c_[c, d]]) matrix([[1, 1, 2, 2],[1, 1, 2, 2],[3, 4, 7, 8],[5, 6, 9, 0]]) >>> np.bmat('a,b; c,d') matrix([[1, 1, 2, 2],[1, 1, 2, 2],[3, 4, 7, 8],[5, 6, 9, 0]])【1x06】numpy.matlib.empty()
numpy.matlib.empty() 函數用于創建一個給定形狀和數據類型的新矩陣。
基本語法:numpy.matlib.empty(shape[, dtype=None, order='C'])
| shape | 定義新矩陣的形狀 |
| dtype | 數據類型,可選項 |
| order | 以行優先(C)或列優先(Fortran)的順序存儲多維數據在內存中,可選項 |
應用舉例:
>>> import numpy as np >>> print(np.matlib.empty((2, 2))) [[9.90263869e+067 8.01304531e+262][2.60799828e-310 0.00000000e+000]] >>> print(np.matlib.empty((2, 2), dtype=int)) [[ -793016358 -243407933][ -959331519 -2060787213]]【1x07】numpy.matlib.zeros()
numpy.matlib.zeros() 函數創建一個以 0 填充的給定形狀和類數據型的矩陣。
基本語法:numpy.matlib.zeros(shape[, dtype=None, order='C'])
| shape | 定義新矩陣的形狀 |
| dtype | 數據類型,可選項 |
| order | 以行優先(C)或列優先(Fortran)的順序存儲多維數據在內存中,可選項 |
應用舉例:
>>> import numpy as np >>> np.matlib.zeros((2, 3)) matrix([[0., 0., 0.],[0., 0., 0.]])【1x08】numpy.matlib.ones()
numpy.matlib.ones() 函數創建一個以 1 填充的給定形狀和類數據型的矩陣。
基本語法:numpy.matlib.ones(shape[, dtype=None, order='C'])
| shape | 定義新矩陣的形狀 |
| dtype | 數據類型,可選項 |
| order | 以行優先(C)或列優先(Fortran)的順序存儲多維數據在內存中,可選項 |
應用舉例:
>>> import numpy as np >>> np.matlib.ones((2, 3)) matrix([[1., 1., 1.],[1., 1., 1.]])【1x09】numpy.matlib.eye()
numpy.matlib.eye() 函數創建一個對角線元素為 1,其他位置為零的矩陣。
基本語法:numpy.matlib.eye(n[, M=None, k=0, dtype=<class 'float'>, order='C'])
| n | 返回的矩陣的行數,int 類型 |
| M | 返回的矩陣的列數,int 類型,可選項,默認為 n |
| k | 對角線索引,可選項,0 表示主對角線,正值表示上對角線,負值表示下對角線,該對角線上元素的值將會是 1 |
| dtype | 返回矩陣的數據類型,可選項 |
| order | 以行優先(C)或列優先(Fortran)的順序存儲多維數據在內存中,可選項 |
應用舉例:
>>> import numpy as np >>> print(np.matlib.eye(n=3, k=1)) [[0. 1. 0.][0. 0. 1.][0. 0. 0.]] >>> print(np.matlib.eye(n=3, k=-1)) [[0. 0. 0.][1. 0. 0.][0. 1. 0.]] >>> print(np.matlib.eye(n=3, M=4, k=0, dtype=int)) [[1 0 0 0][0 1 0 0][0 0 1 0]]【1x10】numpy.matlib.identity()
numpy.matlib.identity() 函數創建一個給定大小的單位矩陣。
單位矩陣:在矩陣的乘法中,有一種矩陣起著特殊的作用,如同數的乘法中的1,這種矩陣被稱為單位矩陣。它是個方陣,從左上角到右下角的對角線(稱為主對角線)上的元素均為1。除此以外全都為0。
基本語法:numpy.matlib.identity(n[, dtype=None])
| n | 返回的單位矩陣的大小,int 類型 |
| dtype | 可選項,返回的單位矩陣的數據類型 |
應用舉例:
>>> import numpy as np >>> print(np.matlib.identity(3, dtype=int)) [[1 0 0][0 1 0][0 0 1]]【1x11】numpy.matlib.repmat()
numpy.matlib.repmat() 函數用于重復數組或矩陣 m*n 次。
基本語法:numpy.matlib.repmat(a, m, n)
| a | 待處理的數組對象 |
| m,n | 沿第一軸和第二軸重復的次數 |
應用舉例:
>>> import numpy as np >>> a = np.array(1) >>> b = np.arange(4) >>> a array(1) >>> b array([0, 1, 2, 3]) >>> >>> print(np.matlib.repmat(a, 2, 3)) [[1 1 1][1 1 1]] >>> print(np.matlib.repmat(b, 2, 2)) [[0 1 2 3 0 1 2 3][0 1 2 3 0 1 2 3]]【1x12】numpy.matlib.rand()
numpy.matlib.rand() 函數創建一個給定大小的矩陣,其中的數據在 [0, 1) 區間隨機取值來填充。
基本語法:numpy.matlib.rand(*args)
參數解釋:*args:輸出矩陣的形狀,如果給定為 N 個整數,則每個整數指定一維的大小,如果以元組形式給出,則該元組表示輸出矩陣完整的形狀。
應用舉例:
>>> import numpy as np >>> print(np.matlib.rand(2, 3)) [[0.27957871 0.48748368 0.0970184 ][0.71062224 0.92503824 0.72415015]] >>> >>> print(np.matlib.rand((2, 3))) [[0.08814715 0.0307317 0.77775332][0.81158748 0.09173265 0.77497881]] >>> >>> print(np.matlib.rand(2, 3), 4) # 如果第一個參數是元組,則其他參數將被忽略 [[0.53407924 0.56006372 0.63903716][0.56132381 0.90300814 0.44074964]] 4【1x13】numpy.matlib.randn()
numpy.matlib.randn() 函數創建一個標準正態分布的隨機矩陣。
標準正態分布,是一個在數學、物理及工程等領域都非常重要的概率分布,在統計學的許多方面有著重大的影響力。期望值μ=0,即曲線圖象對稱軸為Y軸,標準差 σ=1 條件下的正態分布,記為 N(0,1)。
標準正態分布又稱為 u 分布,是以 0 為均數、以 1 為標準差的正態分布,記為 N(0,1)
基本語法:numpy.matlib.randn(*args)
參數解釋:*args:輸出矩陣的形狀,如果給定為 N 個整數,則每個整數指定一維的大小,如果以元組形式給出,則該元組表示輸出矩陣完整的形狀。
應用舉例:
>>> import numpy as np >>> print(np.matlib.randn(2, 3)) [[ 0.82976978 -0.9798698 0.71262414][ 2.31211127 -0.5090537 1.12357032]] >>> >>> print(2.5 * np.matlib.randn((2, 4)) + 3) # 2 x 4 矩陣 N(3, 6.25) [[-0.66974538 4.9354863 2.46138048 7.05576713][ 0.80688217 1.79017491 3.78979646 -1.99071372]]這里是一段防爬蟲文本,請讀者忽略。 本文原創首發于 CSDN,作者 TRHX。 博客首頁:https://itrhx.blog.csdn.net/ 本文鏈接:https://itrhx.blog.csdn.net/article/details/105511641 未經授權,禁止轉載!惡意轉載,后果自負!尊重原創,遠離剽竊!
【2x00】NumPy 線性代數庫
線性代數是數學的一個分支,它的研究對象是向量,向量空間(或稱線性空間),線性變換和有限維的線性方程組。NumPy 中也提供了線性代數函數庫 numpy.linalg。
官方文檔介紹:https://numpy.org/doc/1.18/reference/routines.linalg.html
【2x01】numpy.dot()
numpy.dot() 函數用于計算兩個數組的點積。
基本語法:numpy.dot(a, b[, out=None])
| a | 第一個數組 |
| b | 第二個數組 |
| out | 可選項,放置結果的備用輸出數組 |
- 如果 a 和 b 均為一維數組,計算的是這兩個數組對應下標元素的乘積和(數學上稱之為內積);
- 如果 a 和 b 均為二維數組,計算的是兩個數組的矩陣乘積;
- 如果 a 和 b 均為多維數組,它的通用計算公式為:dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m]),即結果數組中的每個元素都是數組 a 的最后一維上的所有元素與數組 b 的倒數第二維上的所有元素的乘積和。
應用舉例:
>>> import numpy as np >>> a = np.array([[1,2],[3,4]]) >>> b = np.array([[11,12],[13,14]]) >>> print(np.dot(a,b)) # [[1*11+2*13, 1*12+2*14],[3*11+4*13, 3*12+4*14]] [[37 40][85 92]] >>> >>> c = np.arange(3*4*5*6).reshape((3,4,5,6)) >>> d = np.arange(3*4*5*6)[::-1].reshape((5,4,6,3)) >>> print(np.dot(c, d)[2,3,2,1,2,2]) 499128 >>> print(sum(c[2,3,2,:] * d[1,2,:,2])) 499128【2x02】numpy.vdot()
numpy.vdot() 函數返回兩個向量的點積,如果第一個參數是復數,那么它的共軛復數會用于計算。 如果參數是多維數組,它會被展開。
共軛復數:兩個實部相等,虛部互為相反數的復數互為共軛復數。
基本語法:numpy.vdot(a, b)
應用舉例:
>>> import numpy as np >>> a = np.array([1+2j, 3+4j]) >>> b = np.array([5+6j, 7+8j]) >>> print(np.vdot(a, b)) # a 的共軛復數用于計算:(1-2j) * (5+6j) + (3-4j) * (7+8j) (70-8j) >>> print(np.vdot(b, a)) # b 的共軛復數用于計算:(1+2j) * (5-6j) + (3+4j) * (7-8j) (70+8j) >>> >>> >>> c = np.array([[1, 4], [5, 6]]) >>> d = np.array([[4, 1], [2, 2]]) >>> print(np.vdot(c, d)) # 1*4 + 4*1 + 5*2 + 6*2 30【2x03】numpy.inner()
numpy.inner() 函數計算一維數組的點積,對于其他維度,返回最后一個軸上的和的乘積。
基本語法:numpy.inner(a, b)
應用舉例:
>>> import numpy as np >>> a = np.array([[1,2],[3,4]]) >>> b = np.array([[11,12],[13,14]]) >>> print(np.inner(a,b)) # [[1*11+2*12, 1*13+2*14], [3*11+4*12, 3*13+4*14]] [[35 41][81 95]] >>> >>> >>> c = np.array([1,2,3]) >>> d = np.array([0,1,0]) >>> print(np.inner(c,d)) # 1*0+2*1+3*0 2【2x04】numpy.outer()
numpy.outer() 函數計算兩個向量的外積。
基本語法:numpy.outer(a, b[, out=None])
| a | 第一個向量,如果不是一維的則在計算前會將其展平 |
| b | 第一個向量,如果不是一維的則在計算前會將其展平 |
| out | 結果存儲的位置,可選項,類似于 (M, N) 結構的 Ndarray 對象 |
外積一般指兩個向量的向量積,若兩向量:a = [a0, a1, ..., aM] b = [b0, b1, ..., bN],外積如下:
[[a0*b0 a0*b1 ... a0*bN ][a1*b0 .[ ... .[aM*b0 aM*bN ]]應用舉例:
>>> import numpy as np >>> a = np.array([1, 2, 3, 4]) >>> b = np.array([5, 6, 7, 8]) >>> print(np.outer(a, b)) [[ 5 6 7 8][10 12 14 16][15 18 21 24][20 24 28 32]] >>> >>> c = np.array(['a', 'b', 'c'], dtype=object) >>> print(np.outer(c, [1, 2, 3])) [['a' 'aa' 'aaa']['b' 'bb' 'bbb']['c' 'cc' 'ccc']]【2x05】numpy.matmul()
numpy.matmul() 函數計算兩個矩陣的乘積。
矩陣的乘積運算:
設 A 為 m x p 的矩陣,B 為 p x n 的矩陣,那么稱 m x n 的矩陣 C 為矩陣 A 與 B 的乘積,記作 C = AB,其中矩陣 C 中的第 i 行第 j 列元素可以表示為:
(AB)ij=∑k=1paikbkj=ai1b1j+ai2b2j+...+aipbpj(AB)_{ij} = \sum_{k=1}^p a_{ik}b_{kj} = a_{i1}b_{1j} + a_{i2}b_{2j} + ... + a_{ip}b_{pj} (AB)ij?=k=1∑p?aik?bkj?=ai1?b1j?+ai2?b2j?+...+aip?bpj?
A=[a1,1a1,2a1,3a2,1a2,2a2,3]B=[b1,1b1,2b2,1b2,2b3,1b3,2]A = \left[ \begin{matrix} a_{1,1} & a_{1,2} & a_{1,3} \\ a_{2,1} & a_{2,2} & a_{2,3} \end{matrix} \right] \qquad\qquad\qquad\qquad\qquad\qquad B = \left[ \begin{matrix} b_{1,1} & b_{1,2} \\ b_{2,1} & b_{2,2} \\ b_{3,1} & b_{3,2} \end{matrix} \right] A=[a1,1?a2,1??a1,2?a2,2??a1,3?a2,3??]B=???b1,1?b2,1?b3,1??b1,2?b2,2?b3,2?????
C=AB=[a1,1b1,1a1,2b2,1a1,3b3,1,a1,1b1,2a1,2b2,2a1,3b3,2a2,1b1,1a2,2b2,1a2,3b3,1,a2,1b1,2a2,2b2,2a2,3b3,2]C = AB = \left[ \begin{matrix} a_{1,1}b_{1,1} & a_{1,2}b_{2,1} & a_{1,3}b_{3,1}, & a_{1,1}b_{1,2} & a_{1,2}b_{2,2} & a_{1,3}b_{3,2} \\ a_{2,1}b_{1,1} & a_{2,2}b_{2,1} & a_{2,3}b_{3,1}, & a_{2,1}b_{1,2} & a_{2,2}b_{2,2} & a_{2,3}b_{3,2} \end{matrix} \right] C=AB=[a1,1?b1,1?a2,1?b1,1??a1,2?b2,1?a2,2?b2,1??a1,3?b3,1?,a2,3?b3,1?,?a1,1?b1,2?a2,1?b1,2??a1,2?b2,2?a2,2?b2,2??a1,3?b3,2?a2,3?b3,2??]
矩陣相乘的條件:
- 當矩陣 A 的列數(column)等于矩陣 B 的行數(row)時,A 與 B 可以相乘;
- 矩陣 C 的行數等于矩陣 A 的行數,C 的列數等于 B 的列數;
- 乘積 C 的第 m 行第 n 列的元素等于矩陣 A 的第 m 行的元素與矩陣 B 的第 n 列對應元素乘積之和。
應用舉例:
>>> import numpy as np >>> a = np.array([[1,0], [0,1]]) >>> b = np.array([[4,1], [2,2]]) >>> print(np.matmul(a, b)) [[4 1][2 2]] >>> >>> c = np.array([[1,0], [0,1]]) >>> d = np.array([1,2]) >>> print(np.matmul(c, d)) [1 2] >>> print(np.matmul(d, c)) [1 2] >>> >>> e = np.arange(8).reshape(2,2,2) >>> f = np.arange(4).reshape(2,2) >>> print(np.matmul(e, f)) [[[ 2 3][ 6 11]][[10 19][14 27]]]【2x06】numpy.tensordot()
numpy.tensordot() 函數計算兩個不同維度矩陣的乘積。
基本語法:numpy.tensordot(a, b, axes=2)
| a | 第一個矩陣 |
| b | 第二個矩陣 |
| axis | 指定收縮的軸 如果是一個整型 m,表示指定數組 a 的后 m 個軸和數組 b 的前 m 個軸分別進行內積,即對應位置元素相乘、再整體求和 如果是一個列表 [m, n],那么表示 a 的第 m+1 個 (索引為m) 軸和 b 的第 n+1 (索引為n) 個軸進行內積 |
應用舉例:
>>> import numpy as np >>> a = np.random.randint(0, 9, (3, 4)) >>> b = np.random.randint(0, 9, (4, 5)) >>> a array([[4, 0, 3, 6],[1, 3, 2, 2],[6, 1, 3, 4]]) >>> b array([[1, 0, 0, 7, 6],[3, 8, 7, 5, 0],[4, 7, 0, 8, 0],[3, 8, 5, 0, 1]]) >>> print(np.tensordot(a, b, 1)) [[34 69 30 52 30][24 54 31 38 8][33 61 27 71 40]] >>> >>> c = np.array(range(1, 9)).reshape(2, 2, 2) >>> d = np.array(('a', 'b', 'c', 'd'), dtype=object).reshape(2, 2) >>> c array([[[1, 2],[3, 4]],[[5, 6],[7, 8]]]) >>> d array([['a', 'b'],['c', 'd']], dtype=object) >>> print(np.tensordot(c, d)) ['abbcccdddd' 'aaaaabbbbbbcccccccdddddddd']【2x07】numpy.linalg.det()
numpy.linalg.det() 函數計算矩陣的行列式。
陣行列式是指矩陣的全部元素構成的行列式,設 A=(aij) 是數域 P 上的一個 n 階矩陣,則所有 A=(aij) 中的元素組成的行列式稱為矩陣 A 的行列式,記為 |A| 或 det(A)
一個 2×2 矩陣的行列式可表示如下:
det=[abcd]=ad?bcdet = \left[ \begin{matrix} a & b \\ c & d \end{matrix} \right] = ad - bc det=[ac?bd?]=ad?bc
應用舉例:
>>> import numpy as np >>> a = np.array([[1, 2], [3, 4]]) >>> print(np.linalg.det(a)) -2.0000000000000004【2x08】numpy.linalg.solve()
numpy.linalg.solve() 函數求解線性矩陣方程或線性標量方程組。
{3x+y=9x+2y=8用矩陣可表示為:[3112][xy]=[98]\left \{ \begin{aligned} 3x+y=9 \\ x+2y=8 \end{aligned} \right. \qquad用矩陣可表示為:\qquad \left[ \begin{matrix} 3 & 1 \\ 1 & 2 \end{matrix} \right] \left[ \begin{matrix} x & y \end{matrix} \right] = \left[ \begin{matrix} 9 & 8 \end{matrix} \right] {3x+y=9x+2y=8?用矩陣可表示為:[31?12?][x?y?]=[9?8?]
應用舉例:
>>> import numpy as np >>> a = np.array([[3,1], [1,2]]) >>> b = np.array([9,8]) >>> print(np.linalg.solve(a, b)) [2. 3.]【2x09】numpy.linalg.inv()
numpy.linalg.inv() 函數計算矩陣的逆矩陣。
設 A 是數域上的一個 n 階矩陣,若在相同數域上存在另一個 n 階矩陣 B,使得:AB = BA = E,則我們稱 B 是 A 的逆矩陣,而 A 則被稱為可逆矩陣。注:E 為單位矩陣。
應用舉例:
>>> import numpy as np >>> a = np.array([[1, 2], [3, 4]]) >>> b = np.linalg.inv(a) >>> print(b) [[-2. 1. ][ 1.5 -0.5]] >>> >>> a * b == b * a array([[ True, True],[ True, True]])【3x00】NumPy IO 操作
NumPy IO 操作即讀寫磁盤上的文本數據或二進制數據,在 NumPy 中有專門的 .npy / npy 文件,.npy 文件用于儲存單個 Ndarray 對象;.npz 文件用于儲存多個 Ndarray 對象。
【3x01】numpy.save()
numpy.save() 函數將數組保存到二進制文件(.npy 文件)中。
基本語法:numpy.save(file, arr[, allow_pickle=True, fix_imports=True])
| file | 要保存的文件名,可以帶路徑,文件后綴為 .npy,若路徑末尾沒有后綴,則會默認加上 .npy 后綴 |
| arr | 要保存的數組 |
| allow_pickle | bool 值,可選項,是否允許使用 Python pickle 保存數組對象 Python pickle 用于在保存到磁盤文件或從磁盤文件讀取之前,對對象進行序列化和反序列化 pickle 序列化后的數據,可讀性差,人一般無法識別 |
| fix_imports | bool 值,可選項,強制以 Python 2 兼容方式對 Python 3 上的數組對象進行處理 如果 fix_imports 為True,則 pickle 將嘗試將新的 Python 3 名稱映射到 Python 2 中使用的舊模塊名稱,以便 pickle 數據流可被 Python 2 讀取 |
應用舉例:
>>> import numpy as np >>> a = np.array([[1,2,3], [4,5,6]]) >>> np.save('D:\\file\\outfile.npy', a)【3x02】numpy.load()
numpy.load() 函數用于讀取 .npy / npz 文件里面的內容。
基本語法:numpy.load(file[, mmap_mode=None, allow_pickle=False, fix_imports=True, encoding='ASCII'])
| file | 要讀取的 npy 文件對象 |
| mmap_mode | 可選項,讀取文件的模式,可選參數 r+ r w+ c,與 Python 讀取文件模式類似,模式含義參見 numpy.memmap |
| allow_pickle | bool 值,可選項,是否允許使用 Python pickle 保存數組對象 Python pickle 用于在保存到磁盤文件或從磁盤文件讀取之前,對對象進行序列化和反序列化 pickle 序列化后的數據,可讀性差,人一般無法識別 |
| fix_imports | bool 值,可選項,強制以 Python 2 兼容方式對 Python 3 上的數組對象進行處理 如果 fix_imports 為True,則 pickle 將嘗試將新的 Python 3 名稱映射到 Python 2 中使用的舊模塊名稱,以便 pickle 數據流可被 Python 2 讀取 |
| encoding | str 類型,可選項,讀取 Python2 字符串時使用什么編碼 僅當在 Python3 中加載 Python 2 生成的 pickled 文件(包括包含對象數組的 npy/npz 文件)時才有用 不允許使用 latin1、ASCII 和 bytes 以外的值,因為它們可能損壞數字數據。默認值為 ASCII |
應用舉例:
>>> import numpy as np >>> a = np.array([[1,2,3], [4,5,6]]) >>> np.save('D:\\file\\outfile.npy', a) >>> np.load('D:\\file\\outfile.npy') array([[1, 2, 3],[4, 5, 6]])【3x03】numpy.savez()
numpy.savez() 函數將多個數組保存到二進制文件(.npz 文件)中。
基本語法:numpy.savez(file, *args[, **kwds])
| file | 要保存的文件名,可以帶路徑,文件后綴為 .npz,若路徑末尾沒有后綴,則會默認加上 .npz 后綴 |
| args | 保存的數組,由于 Python 不知道外面 savez 的數組的名稱,因此將使用 arr_0,arr_1 等名稱保存數組,這些參數可以是任何表達式 |
| kwds | 關鍵字參數,可選項,數組將與關鍵字名稱一起保存在文件中 |
應用舉例:
>>> import numpy as np >>> a = np.array([[1,2,3],[4,5,6]]) >>> b = np.arange(0, 1.0, 0.1) >>> c = np.sin(b) # c 使用關鍵字參數 sin_array >>> np.savez('D:\\file\\outfile.npz', a, b, sin_array=c) >>> r = np.load('D:\\file\\outfile.npz') >>> print(r.files) # 查看各個數組名稱 ['sin_array', 'arr_0', 'arr_1'] >>> >>> print(r['arr_0']) # 數組 a [[1 2 3][4 5 6]] >>> >>> print(r['arr_1']) # 數組 b [0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9] >>> >>> print(r['sin_array']) # 數組 c [0. 0.09983342 0.19866933 0.29552021 0.38941834 0.479425540.56464247 0.64421769 0.71735609 0.78332691]【3x04】numpy.savetxt()
numpy.savetxt() 函數將數組保存到文本文件中(txt)。
基本語法:numpy.savetxt(fname, X[, fmt='%.18e', delimiter=' ', newline='n', header='', footer='', comments='# ', encoding=None])
| fname | 要保存的文件名,可以帶路徑,如果文件后綴為 .gz,則文件將自動以壓縮格式 gzip 保存 |
| X | 要保存的數組 |
| fmt | 格式序列或多格式字符串,可選項 |
| delimiter | 指定各種分隔符、針對特定列的轉換器函數、需要跳過的行數等,可選項 |
| newline | 字符串或字符分隔線,可選項 |
| header | 寫入文件開頭的字符串,可選項 |
| footer | 寫入文件末尾的字符串,可選項 |
| comments | 注釋,在 header 和 footer 字符串之前添加的字符串,可選項 |
| encoding | 對輸出文件進行編碼,可選項 |
應用舉例:
>>> import numpy as np >>> a = np.array([1,2,3,4,5]) >>> np.savetxt('D:\\file\\outfile.txt', a) >>> np.loadtxt('D:\\file\\outfile.txt') array([1., 2., 3., 4., 5.]) >>> >>> b = np.arange(0,10,0.5).reshape(4,-1) >>> np.savetxt('D:\\file\\outfile2.txt', b, fmt="%d", delimiter=',') # 保存為整數,以逗號分隔 >>> np.loadtxt('D:\\file\\outfile2.txt', delimiter=',') # 讀取數據時也要指定相同的分隔符 array([[0., 0., 1., 1., 2.],[2., 3., 3., 4., 4.],[5., 5., 6., 6., 7.],[7., 8., 8., 9., 9.]])【3x05】numpy.loadtxt()
numpy.loadtxt() 函數用于讀取文本文件(txt)里面的內容。
基本語法:numpy.loadtxt(fname[, dtype=<class 'float'>, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0, encoding='bytes', max_rows=None])
重要參數解釋:
| fname | 要讀取的文件,文件名或生成器。如果文件擴展名是 .gz 或 .bz2,則首先將文件解壓縮,注意,生成器應返回字節字符串 |
| dtype | 可選項,結果數組的數據類型 |
| comments | str 或 str 序列,可選項,用于指示注釋開始的字符或字符列表 |
| delimiter | str 類型,可選項,指定分隔符 |
| skiprows | int 類型,可選項,跳過前 n 行,一般用于跳過第一行表頭 |
| usecols | int 類型的索引值,讀取指定的列 |
| unpack | bool 值,可選項,如果為True,則會對返回的數組進行轉置 |
| ndmin | int 類型,可選項,返回的數組將至少具有 ndmin 維度,否則一維軸將被壓縮 |
| encoding | str 類型,可選項,用于解碼輸入文件的編碼 |
| max_rows | int 類型,可選項,讀取 skiprows 行之后的最大行內容。默認值是讀取所有行 |
應用舉例:
>>> import numpy as np >>> a = np.array([1,2,3,4,5]) >>> np.savetxt('D:\\file\\outfile.txt', a) >>> np.loadtxt('D:\\file\\outfile.txt') array([1., 2., 3., 4., 5.])【3x06】numpy.genfromtxt()
numpy.genfromtxt() 函數同樣用于讀取文本文件(txt)里面的內容。該函數比 loadtxt() 函數功能更加強大,genfromtxt() 主要面向結構數組和缺失數據處理。
官方文檔介紹:https://numpy.org/doc/1.18/reference/generated/numpy.genfromtxt.html
推薦文章:https://www.cnblogs.com/Simplelee/p/8975763.html
主要語法:numpy.genfromtxt(fname[, dtype=<class 'float'>, comments='#', delimiter=None, skip_header=0, skip_footer=0, converters=None, missing_values=None, filling_values=None, usecols=None, encoding='bytes'])
主要參數解釋:
| fname | 要讀取的文件,文件名或生成器。如果文件擴展名是 .gz 或 .bz2,則首先將文件解壓縮,注意,生成器應返回字節字符串 |
| dtype | 可選項,結果數組的數據類型 |
| comments | str 或 str 序列,可選項,用于指示注釋開始的字符或字符列表 |
| delimiter | str 類型,可選項,指定分隔符 |
| skip_header | int 類型,可選項,文件開頭要跳過的行數 |
| skip_footer | int 類型,可選項,文件末尾要跳過的行數 |
| converters | 變量,可選項,將列的數據轉換為值的一組函數 還可以為丟失的數據提供默認值:converters = {3: lambda s: float(s or 0)} |
| missing_values | 變量,可選項,與缺少的數據相對應的字符串集,默認情況下使用空格表示缺失 |
| filling_values | 變量,可選項,缺少數據時用作默認值的一組值 |
| usecols | 序列,可選項,讀取指定的列 |
| encoding | str 類型,可選項,用于解碼輸入文件的編碼 |
應用舉例:
>>> import numpy as np >>> a = np.array([1,2,3,4,5]) >>> np.savetxt('D:\\file\\outfile.txt', a) >>> np.genfromtxt('D:\\file\\outfile.txt') array([1., 2., 3., 4., 5.]) >>> >>> b = np.arange(0,10,0.5).reshape(4,-1) >>> np.savetxt('D:\\file\\outfile2.txt', b, fmt="%d", delimiter=",") >>> np.genfromtxt('D:\\file\\outfile2.txt', delimiter=',') array([[0., 0., 1., 1., 2.],[2., 3., 3., 4., 4.],[5., 5., 6., 6., 7.],[7., 8., 8., 9., 9.]])這里是一段防爬蟲文本,請讀者忽略。 本文原創首發于 CSDN,作者 TRHX。 博客首頁:https://itrhx.blog.csdn.net/ 本文鏈接:https://itrhx.blog.csdn.net/article/details/105511641 未經授權,禁止轉載!惡意轉載,后果自負!尊重原創,遠離剽竊!
總結
以上是生活随笔為你收集整理的Python 数据分析三剑客之 NumPy(六):矩阵 / 线性代数库与 IO 操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑自动写代码不是梦:微软正式上线AI编
- 下一篇: 一架麦道-82客机迫降后起火:曾发生多起