[Python與數(shù)學(xué)建模-數(shù)據(jù)處理與可視化]-1數(shù)值計算工具NumPy

??雖然列表list可以完成數(shù)組操作,但不是真正意義上的數(shù)組,當(dāng)數(shù)據(jù)量很大時,其速度很慢,故提供了NumPy擴展庫完成數(shù)組操作。很多高級擴展庫也依賴于它,比如Scipy、Pandas和Matplotlib等。
??NumPy提供了兩種基本的對象:ndarray(N-dimensional Array Object)和ufunc(Universal Function Object)。ndarray(稱為array數(shù)組,下文統(tǒng)一稱為數(shù)組)是存儲單一數(shù)據(jù)類型的多維數(shù)組,而ufunc則是能夠?qū)?shù)組進行處理的通用函數(shù)。

1數(shù)組的創(chuàng)建、屬性和操作

1.1數(shù)組的創(chuàng)建

??通過NumPy庫的array函數(shù)實現(xiàn)數(shù)組的創(chuàng)建,如果向array函數(shù)中傳入了一個列表或元組,將構(gòu)造簡單的一維數(shù)組;如果傳入多個嵌套的列表或元組,則可以構(gòu)造一個二維數(shù)組。構(gòu)成數(shù)組的元素都具有相同的數(shù)據(jù)類型。下面分別構(gòu)造一維數(shù)組和二維數(shù)組。
??例2.1 利用array函數(shù)創(chuàng)建數(shù)組示例。
??程序文件Pex2_1.py

import numpy as np    #導(dǎo)入模塊并命名為np
a = np.array([2,4,8,20,16,30])  #單個列表創(chuàng)建一維數(shù)組
#嵌套元組創(chuàng)建二維數(shù)組
b = np.array(((1,2,3,4,5),(6,7,8,9,10),
              (10,9,1,2,3),(4,5,6,8,9.0)))
print("一維數(shù)組:",a)
print("二維數(shù)組:\n",b)

??執(zhí)行結(jié)果:

一維數(shù)組:
 [ 2  4  8  20  16  30]
二維數(shù)組:
 [[ 1.  2.  3.  4.  5.]
 [ 6.  7.  8.  9. 10.]
 [10.  9.  1.  2.  3.]
 [ 4.  5.  6.  8.  9.]]

??如上結(jié)果所示,可以將列表或元組轉(zhuǎn)換為一個數(shù)組。在第二個數(shù)組b中,輸入的元素含有整型和浮點型兩種數(shù)據(jù)類型,但輸出的數(shù)組元素都轉(zhuǎn)化為相同的浮點型。
??例2.2 利用arange、linspace、empty等函數(shù)生成數(shù)組示例。
??程序文件Pex2_2.py

import numpy as np
a=np.arange(4,dtype=float)  #創(chuàng)建浮點型數(shù)組:[0., 1.,2., 3.]
b=np.arange(0,10,2,dtype=int)  #創(chuàng)建整型數(shù)組:[0, 2, 4, 6, 8]
c=np.empty((2,3),int)   #創(chuàng)建2×3的整型空矩陣
d=np.linspace(-1,2,5)  #創(chuàng)建數(shù)組:[-1., -0.25,  0.5,  1.25,  2.]
e=np.random.randint(0,3,(2,3))  #生成[0,3)上的2行3列的隨機整數(shù)數(shù)組

??注2.1
??(1)上面程序運行后,沒有輸出,如果想看輸出結(jié)果,讀者可以自己加上print語句;我們以后的程序設(shè)計中,對于一些不重要的中間結(jié)果,也不輸出了。或者使用Anaconda運行,在Spyder的控制臺下可以直接看到輸出結(jié)果。
??(2)empty函數(shù)只分配數(shù)組所使用的內(nèi)存,不對數(shù)組元素值進行初始化操作,因此它的運行速度是最快的,上述程序中c=np.empty((2,3),int)的返回值是隨機的,每次運行都是不一樣的。
??例2.3 使用虛數(shù)單位“j”生成數(shù)組。
??程序文件Pex2_3.py

import numpy as np  
a=np.linspace(0,2,5)   #生成數(shù)組:[0., 0.5, 1., 1.5, 2.]
b=np.mgrid[0:2:5j]     #等價于np.linspace(0,2,5)
x,y=np.mgrid[0:2:4j,10:20:5j]  #生成[0,2]×[10,20]上的4×5的二維數(shù)組
print("x={}\ny={}".format(x,y))

1.2數(shù)組的屬性

??為了更好地理解和使用數(shù)組,了解數(shù)組的基本屬性是十分必要的。數(shù)組的屬性及其說明如表2.1所列。


圖片.png

圖片.png

??程序文件Pex2_4.py

import numpy as np
a=np.random.randint(1,11,(3,5))  #生成[1,10]區(qū)間上3行5列的隨機整數(shù)數(shù)組
print("維數(shù):",a.ndim);   #維數(shù):2
print("維度:",a.shape)       #維度:(3,5)
print("元素總數(shù):",a.size);    #元素總數(shù):15
print("類型:",a.dtype)       #類型:int32
print("每個元素字節(jié)數(shù):",a.itemsize)  #字節(jié)數(shù):4

??例2.5 生成數(shù)學(xué)上一維向量的三種模式。
??程序文件Pex2_5.py

import numpy as np
a=np.array([1,2,3])
print("維度為:",a.shape)    #維度為:(3,)
b=np.array([[1,2,3]])
print("維度為:",b.shape)    #維度為:(1,3)
c=np.array([[1],[2],[3]])
print("維度為:",c.shape)    #維度為:(3,1)

1.3數(shù)組元素的索引

??NumPy中的array數(shù)組與Python基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)列表(list)的區(qū)別是:列表中的元素可以是不同的數(shù)據(jù)類型,而array數(shù)組只允許存儲相同的數(shù)據(jù)類型。
??①對于一維數(shù)組來說,Python原生的列表和NumPy的數(shù)組的切片操作都是相同的,無非是記住一個規(guī)則:列表名(或數(shù)組名)[start: end: step],但不包括索引end對應(yīng)的值。
??②二維數(shù)據(jù)列表元素的引用方式為a[i][j];array數(shù)組元素的引用方式為a[i,j]。
??NumPy比一般的Python 序列提供更多的索引方式。除了用整數(shù)和切片的一般索引外,數(shù)組還可以布爾索引及花式索引。
??(1)一般索引
??例2.6 數(shù)組索
引示例。
??程序文件Pex2_6.py

import numpy as np
a = np.array([2,4,8,20,16,30])  
b = np.array(((1,2,3,4,5),(6,7,8,9,10),
              (10,9,1,2,3),(4,5,6,8,9.0)))
print(a[[2,3,5]])  #一維數(shù)組索引,輸出:[ 8 20 30]
print(a[[-1,-2,-3]])   #一維數(shù)組索引,輸出:[30 16 20]
print(b[1,2])  #輸出第2行第3列元素:8.0
print(b[2])    #輸出第3行元素:[10.  9.  1.  2.  3.]
print(b[2,:])  #輸出第3行元素:[10.  9.  1.  2.  3.]
print(b[:,1])  #輸出第2列所有元素:[2.  7.  9.  5.]
print(b[[2,3],1:4])  #輸出第3、4行,第2、3、4列的元素
print(b[1:3,1:3])    #輸出第2、3行,第2、3列的元素

??如上結(jié)果所示,在一維數(shù)組的索引中,可以將任意位置的索引組裝為列表,用作對應(yīng)元素的獲取;在二維數(shù)組中,位置索引必須寫成[rows,cols]的形式,方括號的前半部分用于控制二維數(shù)組的行索引,后半部分用于控制數(shù)組的列索引。如果需要獲取所有的行或列元素,那么,對應(yīng)的行索引或列索引需要用英文狀態(tài)的冒號表示。
??(2)布爾索引
??例2.7 布爾索引示例。
??程序文件Pex2_7.py

from numpy import array, nan, isnan
a=array([[1, nan, 2], [4, nan, 3]])
b=a[~isnan(a)]  #提取a中非nan的數(shù)
print("b=",b)
print("b中大于2的元素有:", b[b>2])
運行結(jié)果:
b= [1. 2. 4. 3.]
b中大于2的元素有: [4.  3.]

??(3)花式索引
??花式索引的索引值是一個數(shù)組。對于使用一維整型數(shù)組作為索引,如果被索引數(shù)據(jù)是一維數(shù)組,那么索引的結(jié)果就是對應(yīng)位置的元素;如果被索引數(shù)據(jù)是二維數(shù)組,那么就是對應(yīng)下標(biāo)的行。
??對于二維被索引數(shù)據(jù)來說,索引值可以是二維數(shù)據(jù),當(dāng)索引值為兩個維度相同的一維數(shù)組組成的二維數(shù)組時,以兩個維度作為橫縱坐標(biāo)索引出單值后組合成新的一維數(shù)組。
??例2.8 花式索引示例。
??程序文件Pex2_8.py

from numpy import array
x = array([[1,2],[3,4],[5,6]])
print("前兩行元素為:\n", x[[0,1]])         #輸出:[[1,2],[3,4]]
print("x[0][0]和x[1][1]為:", x[[0,1],[0,1]])    #輸出:[1 4]
print("以下兩種格式是一樣的:")
print(x[[0,1]][:,[0,1]]) # 輸出:[[1,2],[3,4]],
print(x[0:2,0:2])        #同上,輸出第1、2行,第1、2列的元素

1.4數(shù)組的修改

??這里數(shù)組的修改是指數(shù)組元素的修改,和數(shù)組維數(shù)的擴大或縮小。
??例2.9 數(shù)組修改示例。
??程序文件Pex2_9.py

import numpy as np
x = np.array([[1,2],[3,4],[5,6]])
x[2,0] = -1  #修改第3行、第1列元素為-1
y=np.delete(x,2,axis=0)   #刪除數(shù)組的第3行
z=np.delete(y,0, axis=1)  #刪除數(shù)組的第1列
t1=np.append(x,[[7,8]],axis=0) #增加一行
t2=np.append(x,[[9],[10],[11]],axis=1) #增加一列

1.5數(shù)組的變形

??在對數(shù)組進行操作時,經(jīng)常要改變數(shù)組的維度。在NumPy中,常用reshape函數(shù)改變數(shù)據(jù)的形狀,也就是改變數(shù)組的維度。其參數(shù)為一個正整數(shù)元組,分別指定數(shù)組在每個維度上的大小。reshape函數(shù)在改變原始數(shù)據(jù)的形狀的同時不改變原始數(shù)據(jù)的值。如果指定的維度和數(shù)組的元素數(shù)目不吻合,則函數(shù)將拋出異常。
??數(shù)組變形和轉(zhuǎn)換的一些函數(shù)(方法也統(tǒng)稱函數(shù))如表2.2所列。


圖片.png

??例2.10 reshape和resize變形示例。
??程序文件Pex2_10.py

import numpy as np
a=np.arange(4).reshape(2,2)  #生成數(shù)組[[0,1],[2,3]]
b=np.arange(4).reshape(2,2)  #生成數(shù)組[[0,1],[2,3]]
print(a.reshape(4,),'\n',a)  #輸出:[0 1 2 3]和[[0,1],[2,3]]
print(b.resize(4,),'\n',b)   #輸出:None和[0 1 2 3] 

??如上結(jié)果所示,雖然reshape和resize都是用來改變數(shù)組形狀的,但是reshape只是返回改變形狀后的視圖,數(shù)組本身是不變的;而resize沒有返回,直接改變數(shù)組本身的形狀。
??如果需要將多維數(shù)組降為一維數(shù)組,利用ravel、flatten和reshape三種方法均可以實現(xiàn)。
??例2.11 數(shù)組降維示例。
??程序文件Pex2_11.py

import numpy as np
a=np.arange(4).reshape(2,2)  #生成數(shù)組[[0,1],[2,3]]
b=np.arange(4).reshape(2,2)  #生成數(shù)組[[0,1],[2,3]]
c=np.arange(4).reshape(2,2)  #生成數(shù)組[[0,1],[2,3]]
print(a.reshape(-1),'\n',a)  #輸出:[0 1 2 3]和[[0,1],[2,3]]
print(b.ravel(),'\n',b)      #輸出:[0 1 2 3]和[[0,1],[2,3]]
print(c.flatten(),'\n',c)    #輸出:[0 1 2 3]和[[0,1],[2,3]]

??從顯示效果看,三種方法是一樣的,原數(shù)組都沒有修改。但我們在平時使用時,flatten()比較合適,在使用過程中flatten()分配了新的內(nèi)存;ravel()返回的是一個數(shù)組的視圖,e=b.ravel()是允許的。
??例2.12 數(shù)組組合效果示例。
??程序文件Pex2_12.py

import numpy as np
a=np.arange(4).reshape(2,2)  #生成數(shù)組[[0,1],[2,3]]
b=np.arange(4,8).reshape(2,2)  #生成數(shù)組[[4,5],[6,7]]
c1=np.vstack([a,b])   #垂直方向組合
c2=np.r_[a,b]        #垂直方向組合
d1=np.hstack([a,b])   #水平方向組合
d2=np.c_[a,b]        #水平方向組合

??例2.13 數(shù)組分割示例。
??程序文件Pex2_13.py

import numpy as np
a=np.arange(4).reshape(2,2)  #構(gòu)造2行2列的數(shù)組
b=np.hsplit(a,2)  #把a平均分成2個列數(shù)組
c=np.vsplit(a,2)  #把a平均分成2個行數(shù)組
print(b[0],'\n',b[1],'\n',c[0],'\n',c[1])

2數(shù)組的運算、通用函數(shù)和廣播運算

2.1四則運算

??在NumPy庫中,實現(xiàn)四則運算既可以使用運算符號+、-、、/,也可以使用函數(shù)add、substract、multiply、divide。需要注意的是,函數(shù)只能接受兩個對象的運算,如果需要多個對象的運算,就得使用嵌套方法。
??另外還有三個數(shù)學(xué)運算符,分別是余數(shù)、整除和冪次,可以使用符號%、//、
*,也可以使用函數(shù)fmod、modf和power。但是整除的函數(shù)應(yīng)用會稍微復(fù)雜一點,需要寫成np.modf(a/b)[1]的格式,因為modf可以返回數(shù)值的小數(shù)部分和整數(shù)部分,而整數(shù)部分就是要取的整數(shù)值。
??例2.14 數(shù)組簡單運算示例。
??程序文件Pex2_14.py

import numpy as np
a=np.arange(10,15); b=np.arange(5,10)
c=a+b; d=a*b  #對應(yīng)元素相加和相乘
e1=np.modf(a/b)[0]  #對應(yīng)元素相除的小數(shù)部分
e2=np.modf(a/b)[1]  #對應(yīng)元素相除的整數(shù)部分

2.2比較運算

??數(shù)組間的比較運算有表2.3所示的六種。


圖片.png

??運用比較運算符返回的是bool類型的值,即True和False。
??例2.15 比較運算示例。
??程序文件Pex2_15.py

import numpy as np
a=np.array([[3,4,9],[12,15,1]])
b=np.array([[2,6,3],[7,8,12]])
print(a[a>b])  #取出a大于b的所有元素,輸出:[ 3  9  12  15]
print(a[a>10]) #取出a大于10的所有元素,輸出:[12  15]
print(np.where(a>10,-1,a)) #a中大于10的元素改為-1
print(np.where(a>10,-1,0)) #a中大于10的元素改為-1,否則為0

??最后一個print語句輸出為:

[[ 0  0  0]
[-1 -1  0]]

??通過上述運行結(jié)果可以看出,多維數(shù)組通過bool索引返回的都是一維數(shù)組;np.where返回的數(shù)組保持原來的形狀。

2.3ufunc函數(shù)

3.ufunc函數(shù)
??ufunc函數(shù)全稱為通用函數(shù),是一種能夠?qū)?shù)組中的逐個元素進行操作的函數(shù)。ufunc函數(shù)是針對數(shù)組進行操作的,并且都以NumPy數(shù)組作為輸出。使用ufunc函數(shù)比使用math庫中的函數(shù)效率要高很多。目前NumPy支持超過60多種的通用函數(shù)。這些函數(shù)包括廣泛的操作,如四則運算、求模、取絕對值、冪函數(shù)、指數(shù)函數(shù)、三角函數(shù)、位運算、比較運算和邏輯運算等。
??例2.16 ufunc函數(shù)效率示例。
??程序文件Pex2_16.py

import numpy as np, time, math
x=[i*0.01 for i in range(1000000)]
start=time.time()  # 1970紀(jì)元后經(jīng)過的浮點秒數(shù)
for (i,t) in enumerate(x): x[i]=math.sin(t)
print("math.sin:", time.time()-start)
y=np.array([i*0.01 for i in range(1000000)])
start=time.time()
y=np.sin(y)
print("numpy.sin:", time.time()-start)

??運行結(jié)果:

math.sin: 0.3449997901916504
numpy.sin: 0.010999917984008789

??可以發(fā)現(xiàn)對數(shù)組的操作,numpy函數(shù)整體花費時間比math模塊函數(shù)要少得多。

2.4ufunc函數(shù)的廣播機制

??廣播(Broadcasting)是指不同形狀的數(shù)組之間執(zhí)行算術(shù)運算的方式。當(dāng)使用ufunc函數(shù)進行數(shù)組計算時,ufunc函數(shù)會對兩個數(shù)組的對應(yīng)元素進行計算。進行這種計算的前提是兩個數(shù)組的維度相容。若兩個數(shù)組的維度不相容時,則NumPy會實行廣播機制。但是數(shù)組的廣播功能是有規(guī)則的,如果不滿足這些規(guī)則,運算時就會出錯。數(shù)組的主要廣播規(guī)則為:
??(1)各輸入數(shù)組的維度可以不相等,但必須確保從右到左的對應(yīng)維度值相等。
??(2)如果對應(yīng)維度值不相等,就必須保證其中一個為1。
??例2.17 廣播機制示例。
??程序文件Pex2_17.py

import numpy as np
a=np.arange(0, 20, 10).reshape(-1, 1)  #變形為1列的數(shù)組,行數(shù)自動計算
b=np.arange(0, 3)
print(a+b)
運行結(jié)果:
[[ 0   1   2]
[10  11  12]]

3NumPy.random模塊的隨機數(shù)生成

??雖然在Python內(nèi)置的random模塊中可以生成隨機數(shù),但是每次只能隨機生成一個隨機數(shù),而且隨機數(shù)的種類也不夠豐富。建議使用NumPy.random模塊的隨機數(shù)生成函數(shù),一方面可以生成隨機向量,另一方面函數(shù)豐富。關(guān)于各種常見的隨機數(shù)生成函數(shù),如表2.4所列。


圖片.png

圖片.png

4文本文件和二進制文件存取

??NumPy提供了多種文件操作函數(shù)以方便用戶存取數(shù)組內(nèi)容。文件存取的格式分為兩類:二進制和文本。而二進制格式的文件又分為NumPy專用的格式化二進制類型和無格式類型。

4.1文本文件的存取

4.1.1savetxt()和loadtxt()存取文本文件

??savetxt()可以把1維和2維數(shù)組保存到文本文件。loadtxt()可以把文本文件中的數(shù)據(jù)加載到1維和2維數(shù)組中。
??例2.18 文本文件存取示例。
??程序文件Pex2_18.py

import numpy as np
a=np.arange(0,3,0.5).reshape(2,3)  #生成2×3的數(shù)組
np.savetxt("Pdata2_18_1.txt", a)  #缺省按照'%.18e'格式保存數(shù)值,以空格分隔
b=np.loadtxt("Pdata2_18_1.txt")  #返回浮點型數(shù)組
print("b=",b)
np.savetxt("Pdata2_18_2.txt", a, fmt="%d", delimiter=",")  #保存為整型數(shù)據(jù),以逗號分隔
c=np.loadtxt("Pdata2_18_2.txt",delimiter=",")  #讀入的時候也需要指定逗號分隔
print("c=",c)
運行結(jié)果:
b= [[0.  0.5  1. ]
[1.5  2.  2.5]]
c= [[0.  0.  1.]
[1.  2.  2.]]

??例2.19 文本文件Pdata2_19.txt中存放如下格式的數(shù)據(jù):

6   2   6   7   4   2   5   9
4   9   5   3   8   5   8   2
5   2   1   9   7   4   3   3
7   6   7   3   9   2   7   1
2   3   9   5   7   2   6   5
5   5   2   2   8   1   4   3

??把其中的數(shù)據(jù)讀入到數(shù)組a,并提取數(shù)組a的前2行、第2列到第4列的元素,構(gòu)造一個2行3列的數(shù)組b。
??程序文件Pex2_19.py

import numpy as np
a=np.loadtxt("Pdata2_19.txt")  #返回值a為浮點型數(shù)據(jù)
b=a[0:2,1:4]  #獲取a的第1,2行,第2,3,4列
print("b=",b)
程序運行結(jié)果如下:
b= [[2.  6.  7.]
 [9.  5.  3.]]

??例2.20 文本文件Pdata2_20.txt中存放如下格式的數(shù)據(jù):

姓名,年齡,體重,身高
張三,30,75,165
李四,45,60,179
王五,15,39,120

??提取其中的數(shù)值數(shù)據(jù)。
??程序文件Pex2_20.py

import numpy as np
a=np.loadtxt("Pdata2_20.txt",dtype=str,delimiter=",")
b=a[1:,1:].astype(float)  #提取a矩陣的數(shù)值行和數(shù)值列,并轉(zhuǎn)換類型
print("b=",b)
運行結(jié)果:
b= [[ 30.  75.  165.]
 [ 45.  60.  179.]
 [ 15.  39.  120.]]

??如果需要處理復(fù)雜的數(shù)據(jù)結(jié)構(gòu),比如處理缺失數(shù)據(jù)等情況,可以使用genfromtxt。

4.1.2genfromtxt讀入文本文件數(shù)據(jù)

??它的調(diào)用格式為:

genfromtxt(fname, dtype=<class 'float'>, comments='#', delimiter=None, skip_header=0, skip_footer=0, converters=None, missing_values=None, filling_values=None, usecols=None, names=None, excludelist=None, deletechars=None, replace_space='_', autostrip=False, case_sensitive=True, defaultfmt='f%i', unpack=None, usemask=False, loose=True, invalid_raise=True, max_rows=None, encoding='bytes')

??我們介紹其中的一些常用參數(shù):

(1)fname:指定需要讀入數(shù)據(jù)的文件名。
(2)dtype:指定讀入數(shù)據(jù)的數(shù)據(jù)類型,默認(rèn)為浮點型,如果原數(shù)據(jù)集中含有字符型數(shù)據(jù),必須指定數(shù)據(jù)類型為“str”。
(3)comments:指定注釋符,默認(rèn)為“#”,如果原數(shù)據(jù)的行首有“#”,將忽略這些行的讀入。
(4)delimiter:指定數(shù)據(jù)集的列分隔符。
(5)skip_header:是否跳過數(shù)據(jù)集的首行,默認(rèn)不跳過。
(6)skip_footer:是否跳過數(shù)據(jù)集的腳注,默認(rèn)不跳過。
(7)converters:將指定列的數(shù)據(jù)轉(zhuǎn)換成其他數(shù)值。
(8)miss_values:指定缺失值的標(biāo)記,如果原數(shù)據(jù)集含指定的標(biāo)記,讀入后這樣的數(shù)據(jù)就為缺失值。
(9)filling_values:指定缺失值的填充值。
(10)usecols:指定需要讀入的列。
(11)names:為讀入數(shù)據(jù)的列設(shè)置列名稱
(12)encoding:如果文件中含有中文,有時需要指定字符編碼。

??例2.21 純文本文件Pdata2_21.txt中存放如下數(shù)據(jù)。分別讀取其中的前6行前8列數(shù)據(jù)、第9列的數(shù)值數(shù)據(jù)、最后一行數(shù)據(jù)。

6       2       6       7       4       2       5       9      60kg
4       9       5       3       8       5       8       2      55kg
5       2       1       9       7       4       3       3      51kg
7       6       7       3       9       2       7       1      43kg
2       3       9       5       7       2       6       5      41kg
5       5       2       2       8       1       4       -999       52kg
35      37      22      32      41      32      43      38

??程序文件Pex2_21.py

import numpy as np
#讀前6行前8列數(shù)據(jù)
a=np.genfromtxt("Pdata2_21.txt",max_rows=6, usecols=range(8)) 
b=np.genfromtxt("Pdata2_21.txt",dtype=str,max_rows=6,usecols=[8])  #讀第9列數(shù)據(jù)
b=[float(v.rstrip('kg')) for (i,v) in enumerate(b)]  #刪除kg,并轉(zhuǎn)換為浮點型數(shù)據(jù)
c=np.genfromtxt("Pdata2_21.txt",skip_header=6)  #讀最后一行數(shù)據(jù)
print(a,'\n',b,'\n',c)

4.2二進制格式文件存取

4.2.1tofile()和fromfile()存取二進制格式文件

??使用數(shù)組對象的tofile()方法可以方便地將數(shù)組中的數(shù)據(jù)以二進制格式寫進文件,tofile()輸出的數(shù)據(jù)不保存數(shù)組形狀和元素類型等信息。因此用fromfile()函數(shù)讀回數(shù)據(jù)時需要用戶指定元素類型,并對數(shù)組的形狀進行適當(dāng)?shù)男薷摹?br> ??例2.22 tofile和fromfile存取二進制格式文件示例。
??程序文件Pex2_22.py

import numpy as np
a=np.arange(6).reshape(2,3)
a.tofile('Pdata2_22.bin')
b=np.fromfile('Pdata2_22.bin',dtype=int).reshape(2,3)
print(b)  

4.2.2load()、save()和savez()存取NumPy專用的二進制格式文件

load()和save()用NumPy專用的二進制格式存取數(shù)據(jù),它們會自動處理元素類型和形狀等信息。
??如果想將多個數(shù)組保存到一個文件中,可以使用savez()。savez()的第一個參數(shù)是文件名,其后的參數(shù)都是需要保存的數(shù)組,輸出的是一個擴展名為npz的壓縮文件。
??例2.23 存取NumPy專用的二進制格式文件示例。
??程序文件Pex2_23.py

import numpy as np
a=np.arange(6).reshape(2,3)
np.save("Pdata2_23_1.npy",a)
b=np.load("Pdata2_23_1.npy")
c=np.arange(6,12).reshape(2,3)
d=np.sin(c)
np.savez("Pdata2_23_2.npz",c,d)
e=np.load("Pdata2_23_2.npz")
f1=e["arr_0"]  #提取第一個數(shù)組的數(shù)據(jù)
f2=e["arr_1"]  #提取第二個數(shù)組的數(shù)據(jù)

??用解壓軟件打開“Pdata2_23_2.npz”文件,會發(fā)現(xiàn)其中有兩個文件:“arr_0.npy”、“arr_1.npy”,其中分別保存著數(shù)組c、d的內(nèi)容。load()自動識別npz文件,并且返回一個類似于字典的對象,可以通過數(shù)組名作為鍵獲取數(shù)組的內(nèi)容。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容