跟Python的IO讀寫功能一樣,numpy中也有文件的讀寫功能,將ndarray對象也可以保存到磁盤文件并從磁盤文件加載。方便保存使用numpy編寫的代碼。在numpy中也有一些高級(jí)的庫,今天我們這里簡單講一下矩陣庫和線性代數(shù)的庫,讓我們更了解numpy這個(gè)模塊。
一、IO操作
Numpy 可以讀寫磁盤上的文本數(shù)據(jù)或二進(jìn)制數(shù)據(jù)。NumPy 為 ndarray 對象引入了一個(gè)簡單的文件格式:npy。npy 文件用于存儲(chǔ)重建 ndarray 所需的數(shù)據(jù)、圖形、dtype 和其他信息。現(xiàn)在在Numpy中可用的IO功能有:
Load()和save()函數(shù)處理numpy二進(jìn)制文件(需要帶npy擴(kuò)展名)
Loadtxt()和savetxt()函數(shù)處理正常的文本文件
Numpy為ndarray對象引入了一個(gè)簡單的文件格式,這個(gè)npy文件在磁盤文件中,存儲(chǔ)重建ndarray 所需的數(shù)據(jù)、圖形、dtype 和其他信息,以便正確獲取數(shù)組,即使該文件在具有不同架構(gòu)的另一臺(tái)機(jī)器上。
numpy.save()
函數(shù)將輸入的數(shù)組存儲(chǔ)在具有npy擴(kuò)展名的磁盤文件中。
為了從outfile.npy重建數(shù)組,需要使用load()函數(shù)
save() 和 load() 函數(shù)接受一個(gè)附加的布爾參數(shù) allow_pickles。Python 中的 pickle 用于 在保存到磁盤文件或從磁盤文件讀取之前,對對象進(jìn)行序列化和反序列化。
2、savetxt()
函數(shù)以簡單文本文件格式存儲(chǔ)和獲取數(shù)組數(shù)據(jù),是通過 savetxt() 和 loadtx() 函數(shù)完成的。
savetxt() 和 loadtxt() 函數(shù)接受附加的可選參數(shù),例如頁首,頁尾和分隔符。
二、numpy中的矩陣庫
NumPy 包包含一個(gè) Matrix 庫 numpy.matlib 。此模塊的函數(shù)返回矩陣而不是返回 ndarray對象。一個(gè)m*n的矩陣是一個(gè)由m行(row)n列(column)元素排列成的矩形陣列。矩陣?yán)锏脑乜梢允菙?shù)字、符號(hào)或數(shù)學(xué)式。
matlib.empty()
函數(shù)返回一個(gè)新的矩陣,且不初始化元素。
2、numpy.matlib.zeros()
此函數(shù)返回以0填充的矩陣。
3、numpy.matlib.ones()
此函數(shù)返回以1填充的矩陣。
4、numpy.matlib.eye()
這個(gè)函數(shù)返回一個(gè)矩陣,對角線元素為 1,其他位置為零。
5、numpy.matlib.identity()
函數(shù)返回給定大小的單位矩陣。單位矩陣是主對角線元素都為 1 的方陣。
6、numpy.matlib.rand()
函數(shù)返回給定大小的填充隨機(jī)值的矩陣
在這里需要注意的是,矩陣總是二維的,而ndarray是一個(gè)n維數(shù)組,兩個(gè)對象都是可以互換的,但是兩個(gè)對象并不是相同的。
三、線性代數(shù)庫
相信大家在學(xué)習(xí)線性代數(shù)的時(shí)候,都會(huì)覺得線性代數(shù)是非常難學(xué)的,線性代數(shù)就像一層硬紙,剛開始學(xué)習(xí)的時(shí)候是非常難以穿透的,但是只要認(rèn)真的學(xué)下去,那么穿過那個(gè)點(diǎn)之后呢就恍然大悟,當(dāng)然對線性代數(shù)掌握不是很好的人也沒事,numpy中有專門的庫numpy.linalg可以提供線性代數(shù)所需要的所有功能,我們可以先學(xué)習(xí)如何處理,然后在慢慢的去學(xué)習(xí)線性代數(shù)基礎(chǔ)知識(shí)。
Numpy中提供的方法如下:
numpy.dot() 返回兩個(gè)數(shù)組的點(diǎn)積
numpy.vdot() 返回兩個(gè)向量的點(diǎn)積
numpy.inner() 返回一維數(shù)組的向量內(nèi)積
numpy.matmul() 返回兩個(gè)數(shù)組的矩陣乘積
numpy.linalg.det() 計(jì)算輸入矩陣的行列式
numpy.linalg.solve() 求解矩陣形式的線性方程的解
numpy.linalg.inv() 計(jì)算矩陣的逆
接下來我們就一個(gè)一個(gè)方法開始學(xué)習(xí)如何處理線性代數(shù)的方法。
1、numpy.dot()
這個(gè)函數(shù)返回兩個(gè)數(shù)組的點(diǎn)積。對于二維向量,相當(dāng)于是矩陣乘法。對于一維數(shù)組,它是向量的內(nèi)積。對于 N 維數(shù)組,它是a的最后一個(gè)軸上的和與b的倒數(shù)第二個(gè)軸的乘積。
1.1什么是矩陣乘法
在這里我在帶領(lǐng)大家復(fù)習(xí)一下什么矩陣乘法,首先在百度中矩陣乘法的定義是這樣的:
矩陣相乘最重要的方法是一般矩陣乘積。它只有在第一個(gè)矩陣的列數(shù)(column)和第二個(gè)矩陣的行數(shù)(row)相同時(shí)才有意義。一般單指矩陣乘積時(shí),指的便是一般矩陣乘積。一個(gè)m×n的矩陣就是m×n個(gè)數(shù)排成m行n列的一個(gè)數(shù)陣。由于它把許多數(shù)據(jù)緊湊的集中到了一起,所以有時(shí)候可以簡便地表示一些復(fù)雜的模型。
這么看其實(shí)是比較復(fù)雜的,但是咱們分開來學(xué),也是很簡單的,假設(shè)A矩陣為m行p列,B矩陣為p行n列,矩陣相乘后,A*B=C,那么C矩陣就是m行n列,也就是說矩陣C的行數(shù)=矩陣A的行數(shù),矩陣C的列數(shù)=矩陣B的列數(shù),矩陣相乘就是A矩陣的行去乘以B矩陣的列。這么說可能還是有一些復(fù)雜,咱們看一下實(shí)例就能明白了。
1.2實(shí)例
在這個(gè)例子中,C矩陣的第一行第一個(gè)元素的結(jié)果是A矩陣的第一行B矩陣的第一列,也就是11+213=37,第一行第二個(gè)元素的結(jié)果為112+214=40。第二行第一個(gè)元素為311+413=85,第二行第二個(gè)元素為312+4*14=92。這么看的話是不是感覺就很清楚了。
在Python的較新版本中還支持了直接使用@號(hào)作為矩陣的乘法,避免在調(diào)用numpy.dot()方法了。
2、numpy.vdot()
這個(gè)函數(shù)返回兩個(gè)向量的點(diǎn)積。如果第一個(gè)參數(shù)是復(fù)數(shù),那么它的共軛復(fù)數(shù)會(huì)用于計(jì)算。如果參數(shù)是多維數(shù)組,它會(huì)被展開。
在這里看,點(diǎn)積也就是對應(yīng)的元素相乘,也就是111+212+313+414=130,這個(gè)方法要求兩個(gè)向量的元素相同不在乎行和列,如果不同的話則會(huì)報(bào)錯(cuò)。
3、numpy.inner()
這個(gè)函數(shù)返回一維數(shù)組的向量內(nèi)積。對于更高的維度,它返回最后一個(gè)軸上的乘積的和。
3.1、一維數(shù)組
結(jié)果等價(jià)于10+21+3*0
3.2、二維數(shù)組
上面的列子中,內(nèi)積的計(jì)算如下
Array([[111+212,113+214],
[311+412,313+414]])
4、numpy.matmul()
這個(gè)函數(shù)結(jié)果返回兩個(gè)數(shù)組的矩陣乘積。雖然它返回二維數(shù)組的正常乘積,但如果任一參數(shù)的維數(shù)大于 2,則將其視為存在于最后兩個(gè)索引的矩陣的棧,并進(jìn)行相應(yīng)廣播。另一方面,如果任一參數(shù)是一 維數(shù)組,則通過在其維度上附加 1 來將其提升為矩陣,并在乘法之后被去除。
4.1、對于二維數(shù)組來說,它就是矩陣的乘法
4.2、二維和一維的運(yùn)算
計(jì)算的過程為:
Np.matmul(a,b)=[111+212 312+412]
Np.matmul(b,a)=[111+123 112+124]
4.3、維度大于2的數(shù)組
計(jì)算過程為
Array([[[00+12,01+31],
[20+36,21+33]],
[[40+52,41+53],
[60+72,61+73]]])
5、numpy.linalg.det()
這個(gè)函數(shù)計(jì)算輸入矩陣的行列式。行列式在線性代數(shù)中是非常有用的值。
6、numpy.linalg.solve()
函數(shù)給出了矩陣形式的線性方程的解。
例如,考慮以下線性方程:
x + y + z = 6
2y + 5z = -4
2x + 5y - z = 27
可以使用矩陣表示為:
1 2 3
4 5 6 .$\left[\begin{matrix}x\y\z\end{matrix|\right]
7 8 9
$
6
-4
27
如果矩陣成為A、X和B,方程變?yōu)锽
7、numpy.linalg.inv()
這個(gè)函數(shù)是用來計(jì)算矩陣的逆。
聯(lián)系客服