【Python学习日志】 - Numpy包
NumPy是什么?
使用Python進行科學計算的基礎包,在數據分析的時候比較常用到矩陣計算。這時太多的Np屬性不記得,所以方便自己使用把一些常用的Np屬性匯總記錄一下使用的時候方便查找。
ndarray.ndim
陣列的軸數(尺寸)。
ndarray.shape
數組的大小。這是一個整數元組,表示每個維度中數組的大小。對于具有n行和m列的矩陣,shape將是(n,m)。shape因此,元組的長度 是軸的數量ndim。
ndarray.size
數組的元素總數。這相當于元素的乘積shape。
ndarray.dtype
描述數組中元素類型的對象。可以使用標準Python類型創建或指定dtype。此外,NumPy還提供自己的類型。numpy.int32,numpy.int16和numpy.float64就是一些例子。
ndarray.itemsize
數組中每個元素的大小(以字節為單位)。例如,類型的元素數組float64有itemsize8(= 64/8),而其中一個類型complex32有itemsize4(= 32/8)。它相當于ndarray.dtype.itemsize。
ndarray.data
包含數組實際元素的緩沖區。通常,我們不需要使用此屬性,因為我們將使用索引工具訪問數組中的元素
?
?
雜亂的知識?
查看一個函數的幫助文檔,可以直接在文件里輸入代碼:? help(np.add)
或者在命令行中輸入:np.info(np.add)
查看包的版本號信息,可以直接輸出:? ? np.__version__
用zero函數創建數組,默認單元大小是八個字節(也就是默認double?)
import numpy as np A = np.zeros(4) print(A.itemsize) print(A.itemsize*A.size)輸出: 8 32注意數組起始下標是從0開始的。
關于arange和reshape函數:
import numpy as np A = np.arange(8).reshape(2,4) print(A)輸出: [[0 1 2 3][4 5 6 7]]關于返回非零元素的下標的一系列騷操作:
import numpy as np A = np.arange(8).reshape(2,4) A=A+1 A[0][1]=0 print(A) print(np.nonzero(A))輸出: [[1 0 3 4][5 6 7 8]] (array([0, 0, 0, 1, 1, 1, 1], dtype=int64), array([0, 2, 3, 0, 1, 2, 3], dtype=int64))?其中返回的兩個參數,一個是第一維的下標,一個是第二維的下標。
關于eye函數,random函數,以及變量性質的測試
B = np.eye(2) print(B) print(B.size) print(B[0][1]) B=np.random.random((3,2)) print(B) B="hello" print(B)輸出: [[1. 0.][0. 1.]] 4 0.0 [[0.29490288 0.14067274][0.96161076 0.92929841][0.26694438 0.40938209]] hello由此可見,相同都變量名是可以在不同時刻代替不同東西的。
但是不能對這個變量的其中一部分進行代替操作:(下面的函數中,只運行前兩行是沒有問題的)
程序1: qqweqeqweqq = np.zeros(12) for i in range(10):qqweqeqweqq[i]=np.zeros(12)Error: ValueError: setting an array element with a sequence. ---------------------------------------------------------------------------------- 程序2: qqweqeqweqq = np.zeros((10,2)) for i in range(10):qqweqeqweqq[i]=np.zeros(12)Error: ValueError: could not broadcast input array from shape (12) into shape (2)但是這樣是沒有問題的:
qqweqeqweqq = np.zeros((10,2)) qqweqeqweqq = np.zeros(12)疑問:sequence,array,list,dic,都有啥區別??
sum函數,max函數,min函數,mean函數
B=np.random.random((3,2)) print(B) print(B.max(),B.min(),B.mean())輸出: [[0.89882712 0.77860196][0.7093924 0.15120126][0.99924821 0.91765126]] 0.9992482107724574 0.15120126168466463 0.7424870345505307?對應的,可以添加參數axis=0代表在第0維上進行合并
進一步體驗random函數
np1.random.rand(0-1之間的的隨機數生成)\randn(服從正態分布的隨機數生成)\randint(隨機整數的生成)\choice([])(隨機數產生的范圍自定義)\......(其他隨機數類型),舉例如下:(圖片源自鏈接)
體驗索引下標區別:
B=np.arange(25).reshape((5,5)) print(B) print(B[1:-1,1:-1]) print(B[1:-1]) print(B[1:-1][1:-1])輸出: [[ 0 1 2 3 4][ 5 6 7 8 9][10 11 12 13 14][15 16 17 18 19][20 21 22 23 24]] [[ 6 7 8][11 12 13][16 17 18]] [[ 5 6 7 8 9][10 11 12 13 14][15 16 17 18 19]]int,float,str之間的類型轉換:
num2 = "123";num2 = int(num1);print("num2: %d" % num2);'''輸出 num2: 123'''num1 = "123.12";num2 = float(num1);print("num2: %f" % num2);'''num2: 123.120000'''num = 123;mystr = str(num);print ("%s" % mystr);''' 輸出 123 '''其他小測試:(關于numpy的sum函數)
range(2,4) Out[141]: range(2, 4)np.sum(range(4)) Out[142]: 6qqqq=range(4)qqqq Out[144]: range(0, 4)type(qqqq) Out[145]: rangenp.sum(range(10,12)) Out[146]: 21?
numpy包中,還有一個非常實用的玩意:矩陣操作。
創建一個矩陣,可以使用函數np,mat(...),參數可以是一個list或者是一個narray。
你想構建一個2*3的全1矩陣,則只需要:
A=np.mat(np.ones(6).reshape(2,3))即可。
現在假設A是個矩陣,那么:
求矩陣的逆:A.I? ? ? ? ?或者:np.linalg.inv(A)
求矩陣的轉置:A.T? ? ?或者:? A.linalg.transpose()
求矩陣的行列式:np.linalg.det(A)
求矩陣的特征值和特征向量:np.linalg.eig(np1)
矩陣的點乘:np.linalg.dot(A,B)
求線性方程組的解:
首先寫出方程組的右邊的y值向量:y=np.array([[y1],[y2],[y3]...])
函數值的集合等于 x=np.linalg.solve(A,y)
?
但是要注意np.mat()和np.matrix()的區別:后者是完全復制,前者是當參數是矩陣的時候是直接引用的。
關于數據保存
?
Numpy提供了幾種數據保存的方法。
? ?以3*4數組a為例:
? ? 1. a.tofile("filename.bin")
? ? ? 這種方法只能保存為二進制文件,且不能保存當前數據的行列信息,文件后綴不一定非要是bin,也可以為txt,但不影響保存格式,都是二進制。
? ? ? 這種保存方法對數據讀取有要求,需要手動指定讀出來的數據的的dtype,如果指定的格式與保存時的不一致,則讀出來的就是錯誤的數據。
? ? ? ?b = numpy.fromfile("filename.bin",dtype = **)
? ? ? ?讀出來的數據是一維數組,需要利用
? ? ? ? b.shape = 3,4重新指定維數。
? ? 2.numpy.save("filename.npy",a)
? ? ? ?利用這種方法,保存文件的后綴名字一定會被置為.npy,這種格式最好只用
? ? ? ?numpy.load("filename")來讀取。
? ?3.numpy.savetxt("filename.txt",a)
? ? ? b = ?numpy.loadtxt("filename.txt")
? ? ?用于處理一維和二維數組
?
兩個數組的拼接:
np.concatenate((list1,list2),axis=0):矩陣之間的拼接
axis=0,代表在行方向上拼接(豎著接到后面)
axis=1,代表在列方向上拼接(橫著接到后面)
總結
以上是生活随笔為你收集整理的【Python学习日志】 - Numpy包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 考生成绩被屏蔽4天后查 全省前50:网友
- 下一篇: 【Python学习】 - skimage