1.numpy
numpy和list的區別在於,numpy只能保存同類型數據,在list則可以保存不同類型的數據。numpy的底層是用C語言進行編寫的,所以同樣類型的函數,numpy的計算速度會高於同樣功能的python函數。numpy中支持的數據類型主要有以下幾種:
類型 | 取值範圍 | 簡寫 |
---|---|---|
np.bool | True或Fasle(假設a是一個numpy的array數據類型爲np.int16的變量,(a>5).dtype就是bool型。使用np.bool型也可以對數列進行過濾。 | ‘b’ |
np.int8 | 佔1個字節的內存,取值範圍從 -128到127(有符號整數) | 'i' |
np.int16 | 佔2個字節的內存,取值範圍從-32768到32767 | ‘i2’ |
np.int32 | 佔4個字節的內存,取值範圍從-2^31到2^31-1 | ‘i4’ |
np.int64 | 佔8個字節的內存,取值範圍從-2^63到2^36-1 | 'i8' |
np.uint8/np.uint16/ np.uint32/np.uint64 |
分別佔1個、2個、4個、8個字節的內存,取值範圍從0到 2^{8,16,32,64}-1 |
'u'\'u2' \'u4'\'u8' |
np.float16 | 半精度浮點數:16位。其中1個符號位,5個指數位,10個精度位(這10個精度位應該表示的是小數位) | ‘f2’ |
np.float32 | 單精度浮點數:32位。其中1個符號位,8個指數位,23個精度位 | ‘f4’ |
np.float64 | 雙精度浮點數:64位。其中1個符號位,11個指數爲,52個精度位 | ‘f8’ |
np.complex64 | 複數。分別用兩個32位浮點數表示實部和虛部。(那就應該是佔用8個字節) | ‘c8’ |
np.complex128 | 複數。分別用兩個64位浮點數表示實部和虛部。 | ‘c16’ |
np.object_ | python對象 | ‘O’ |
np.string_ | 字符串 | ‘S’ |
np.unicode_ | unicode類型 | ‘U’ |
注意:類型之間是可以進行隱式轉換的。其他非數值性的數據類型可能很少用到,就不深入研究了。
2.幾個函數用法
2.1 reshape用法
reshape()函數中的order參數三種取值:order='C',默認值。當使用這種模式時,相當於行優先(最後一個索引優先變動)。order='F',在從第一個索引開始變動。order='A',則取決於數組在內存中的存儲方式。
import numpy as np
a=np.arange(1,13).reshape(2,2,3)
print(a)
print("*"*25)
a_1=a.reshape((1,12))
print(a_1)
print("*"*25)
a_2=a.reshape((1,12),order='F')
print(a_2)
print("*"*25)
a_3=a.reshape((1,12),order='A')
print(a_3)
輸出結果如下:
[[[ 1 2 3] [ 4 5 6]] [[ 7 8 9] [10 11 12]]] ************************* [[ 1 2 3 4 5 6 7 8 9 10 11 12]] ************************* [[ 1 7 4 10 2 8 5 11 3 9 6 12]] ************************* [[ 1 2 3 4 5 6 7 8 9 10 11 12]] |
2.2 np.append()函數用法
np.append(arr,values,axis=None)中,axis是可選參數。如果不設置axis,則np.append()返回的結果返回將arr和values展平再進行拼接。
import numpy as np
a=np.append([1,2,3],[4,5,6])
print(a)
print("*"*25)
a_1=np.append([1,2,3],[[4,5,6]])
print(a_1)
print("*"*25)
a_2=np.append([[1,2,3]],[4,5,6])
print(a_2)
print("*"*25)
a_3=np.append([[1,2,3]],[[[4,5,6]]])
print(a_3)
print("*"*25)
#a_4這種寫法不會報錯,但是a_4的數據類型從np.int類型變成了np.object
a_4=np.append([1,2,3],[[1],[2,3]])
print(a_4)
代碼運行結果如下:
[1 2 3 4 5 6] ************************* [1 2 3 4 5 6] ************************* [1 2 3 4 5 6] ************************* [1 2 3 4 5 6] ************************* [1 2 3 list([1]) list([2, 3])] |
當設置了axis參數後,情況就不一樣了,下面先以二維數組爲例:
import numpy as np
a_1=np.append([[1,2,3],[4,5,6]],[[7,8,9]],axis=0)
print(a_1)
print("*"*25)
a_2=np.append([[1,2,3],[4,5,6]],[[10,12,14]],axis=0)
print(a_2)
print("*"*25)
a_3=np.append([[1,2,3],[4,5,6]],[[10,12],[11,13]],axis=1)
print(a_3)
代碼運行結果如下:
[[1 2 3] [4 5 6] [7 8 9]] ************************* [[ 1 2 3] [ 4 5 6] [10 12 14]] ************************* [[ 1 2 3 10 12] [ 4 5 6 11 13] |
從上面的實驗結果可以發現。當axis=0的時候,arr和values則要求其在axis=1軸的維度相同(即具有相同的列)。當axis=1時,則要求arr和values在axis=0軸上維度相同(即具有相同的行數)。下面在來看看在三維矩陣上的情況。
import numpy as np
a=np.arange(4).reshape(2,2,1)
print(a)
print("*"*25)
a_1=np.append(a,[[[10],[12]]],axis=0)
#value的維度必須滿足(任意,3,1)才能添加到a的後面
print(a_1)
print("*"*25)
a_2=np.append(a,[[[14]],[[15]]],axis=1)
#value的維度必須滿足(2,任意,1)才能添加到a的後面
print(a_2)
print("*"*25)
a_3=np.append(a,[[[20,21],[22,23]],[[26,27],[28,29]]],axis=2)
#value的維度必須滿足(2,3,任意)才能添加到a的後面
print(a_3)
代碼運行結果如下:
[[[0] [1]] [[2] [3]]] ************************* [[[ 0] [ 1]] [[ 2] [ 3]] [[10] [12]]] ************************* [[[ 0] [ 1] [14]] [[ 2] [ 3] [15]]] ************************* [[[ 0 20 21] [ 1 22 23]] [[ 2 26 27] [ 3 28 29]]] |
2.3 np.insert()函數用法
np.insert(arr,obj,values,axis)和np.append()用法類似,但np.insert()的用法更靈活。np.append()新增的數據只能在每行每列的最後,其位置是規定的。而np.insert()添加的位置是可以指定的(由參數obj確定)。np.insert()中的axis的作用於np.append()中的作用相同,但其在進行插入的時候,對arr和values的維度不再有限制。
先看看obj對結果的影響。(注意,obj可以是int型、序列或者切片)
a=np.array([[1,2],[3,4],[5,6]])
print(a)
print("*"*25)
a_1=np.insert(a,3,[1])#不加axis時,數據進行展開構成一維數組
print(a_1)
print("*"*25)
a_2=np.insert(a,2,7,axis=0)
print(a_2)
print("*"*25)
a_3=np.insert(a,[2,2],7,axis=0)
print(a_3)
print("*"*25)
a_4=np.insert(a,[2,0],7,axis=0)
print(a_4)
代碼運行結果如下。從運行結果中可以發現,obj的取值範圍是0到len.shape[axis]。
[[1 2] [3 4] [5 6]] ************************* [1 2 3 1 4 5 6] ************************* [[1 2] [3 4] [7 7] [5 6]] ************************* [[1 2] [3 4] [7 7] [7 7] [5 6]] ************************* [[7 7] [1 2] [3 4] [7 7] [5 6]] |
再來看看values的形式對結果的影響。從以下代碼可以看出,np.insert()對arr和values的形式更靈活
a=np.array([[1,2],[3,4],[5,6]])
print(a)
print("*"*25)
a_1=np.insert(a,2,[1],axis=1)
print(a_1)
print("*"*25)
a_2=np.insert(a,2,1,axis=1)
print(a_2)
print("*"*25)
a_3=np.insert(a,2,[1,2,3],axis=1)
print(a_3)
print("*"*25)
a_4=np.insert(a,2,[[1,3,9]],axis=1)
print(a_4)
代碼運行結果如下:
[[1 2] [3 4] [5 6]] ************************* [[1 2 1] [3 4 1] [5 6 1]] ************************* [[1 2 1] [3 4 1] [5 6 1]] ************************* [[1 2 1] [3 4 2] [5 6 3]] ************************* [[1 2 1] [3 4 3] [5 6 9]] |
2.3 np.delete()
np.delete(arr,obj,asix)函數實現按照axis和obj對arr進行元素刪除的功能。如果沒有設置axis,則對arr進行flatten之後再刪除。
import numpy as np
a=np.arange(12).reshape(2,2,3)
print(a)
print("*"*25)
a_1=np.delete(a,1,axis=0)
print(a_1)
print("*"*25)
a_2=np.delete(a,1,axis=1)
print(a_2)
print("*"*25)
a_3=np.delete(a,1,axis=2)
print(a_3)
print("*"*25)
a_4=np.delete(a,1)
print(a_4)
print("*"*25)
a_5=np.delete(a,slice(2,5))
print(a_5)
print("*"*25)
a_6=np.delete(a,[2,6])
print(a_6)
代碼運行結果如下:
[[[ 0 1 2] [ 3 4 5]] [[ 6 7 8] [ 9 10 11]]] ************************* [[[0 1 2] [3 4 5]]] ************************* [[[0 1 2]] [[6 7 8]]] ************************* [[[ 0 2] [ 3 5]] [[ 6 8] [ 9 11]]] ************************* [ 0 2 3 4 5 6 7 8 9 10 11] ************************* [ 0 1 5 6 7 8 9 10 11] ************************* [ 0 1 3 4 5 7 8 9 10 11] |