Python之Numpy入门实战教程(1):基础篇
Numpy、Pandas、Matplotlib是Python的三個重要科學計算庫,今天整理了Numpy的入門實戰教程。NumPy是使用Python進行科學計算的基礎庫。 NumPy以強大的N維數組對象為中心,它還包含有用的線性代數,傅里葉變換和隨機數函數。
強烈建議大家將本文中的程序運行一遍。這樣能加深對numpy庫的使用。
目錄
1.Creating arrays
1)創建全零數組
2)創建其余類型數組
2.Array data
3.Reshaping an array
1)reshape and ravel
4.Arithmetic operations
5.Broadcasting
1)廣播規則
6.Conditional operators
7.Mathematical and statistical functions
1)ndarray?methods
2)Universal functions
3)Binary ufuncs
8.Array indexing
1)Differences with regular python arrays
2)Multi-dimensional arrays
3) Fancy indexing &Higher dimensions&Boolean indexing
9.Iterating
10.Stacking arrays
1)vstack
2)hstack
3)concatenate
4)stack
11.Splitting arrays
12.Transposing arrays
13.Vectorization
14.Saving and loading
1.Creating arrays
1)創建全零數組
]現在我們來導入numpy,并進行創建數組操作:
#導入numpy庫 import numpy as npnp.zeros(5) #輸出 “array([0., 0., 0., 0., 0.])”#創建二維數組,并指定行數和列數 np.zeros(3,4)#輸出 array([[0., 0., 0., 0.],[0., 0., 0., 0.],[0., 0., 0., 0.]])下面來介紹一下,在numpy中有關的概念:
- axis:在numpy中,每一個維度稱為axis;
- rank:軸的個數稱為rank;例如:上面的3x4矩陣的秩為2,;
- shape:一個維度上的列表長度稱為shape;例如:上面的矩陣的shape是(3, 4);
- size:數學的所有元素個數為size;例如:上面矩陣的size是:3*4=12;
我們現在來創建任意維度的數組,下面是創建一個3維數組,形狀是(2,3,4):
np.zeros((2,3,4))#輸出 array([[[0., 0., 0., 0.],[0., 0., 0., 0.],[0., 0., 0., 0.]],[[0., 0., 0., 0.],[0., 0., 0., 0.],[0., 0., 0., 0.]]])#查看數組類型 type(np.zeros((3,4))) #輸出 "numpy.ndarray"2)創建其余類型數組
#創建元素全為1的數組 np.ones(1) #輸出 array([[1., 1., 1., 1.],[1., 1., 1., 1.],[1., 1., 1., 1.]])#創建給定值初始化的數組,這是一個全為π的3x4矩陣 np.full((3,4), np.pi) #輸出 array([[3.14159265, 3.14159265, 3.14159265, 3.14159265],[3.14159265, 3.14159265, 3.14159265, 3.14159265],[3.14159265, 3.14159265, 3.14159265, 3.14159265]])#一個未初始化的2x3數組(內容隨機) np.empty((2,3)) #輸出 array([[4.65802320e-310, 4.65802160e-310, 4.65802012e-310],[6.94949919e-310, 0.00000000e+000, 0.00000000e+000]])#使用array函數和常規python數組初始化ndarray np.array([[1,2,3,4], [10,20,30,40]]) #輸出 array([[ 1, 2, 3, 4],[10, 20, 30, 40]])#使用NumPy的范圍函數創建一個ndarray,它類似于python的內置范圍函數 np.arange(1, 5) #輸出 array([1, 2, 3, 4])np.arange(1.0, 5.0) #輸出 array([1., 2., 3., 4.])#提供步長參數 np.arange(1, 5, 0.5) #輸出 array([1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5])#當元素為浮點數時,元素個數可能會有變化 print(np.arange(0, 5/3, 1/3)) print(np.arange(0, 5/3, 0.333333333)) print(np.arange(0, 5/3, 0.333333334))#輸出 [0. 0.33333333 0.66666667 1. 1.33333333 1.66666667] [0. 0.33333333 0.66666667 1. 1.33333333 1.66666667] [0. 0.33333333 0.66666667 1. 1.33333334]#在使用浮點數時,通常最好使用linspace函數而不是arange print(np.linspace(0, 5/3, 6)) #輸出 [0. 0.33333333 0.66666667 1. 1.33333333 1.66666667]#NumPy的隨機模塊中提供了許多函數來創建用隨機值初始化的ndarray(0-1之間) np.random.rand(3,4) #輸出 array([[0.7277128 , 0.68775769, 0.34351181, 0.02168851],[0.86629136, 0.06427389, 0.64314693, 0.94817528],[0.21333456, 0.78559298, 0.71692429, 0.5635313 ]])#隨機初始化矩陣,服從高斯分布(均值為0,方差為1) np.random.randn(3,4) #輸出 array([[-1.07334865, 1.57525255, -0.07676677, 0.95149926],[ 0.9378264 , -1.20141156, 0.08230785, 0.38547522],[-1.2885052 , -0.96175548, 0.24121048, 1.36009648]])為了更好的說明上面的隨機分布,我們繪制以下圖形:
%matplotlib inline import matplotlib.pyplot as pltplt.hist(np.random.rand(100000), normed=True, bins=100, histtype="step", color="blue", label="rand") plt.hist(np.random.randn(100000), normed=True, bins=100, histtype="step", color="red", label="randn") plt.axis([-2.5, 2.5, 0, 1.1]) plt.legend(loc = "upper left") plt.title("Random distributions") plt.xlabel("Value") plt.ylabel("Density") plt.show()你也可以通過函數來初始化數組:
def my_function(z, y, x):return x * y + znp.fromfunction(my_function, (3, 2, 10))#輸出 array([[[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]],[[ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],[ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.]],[[ 2., 2., 2., 2., 2., 2., 2., 2., 2., 2.],[ 2., 3., 4., 5., 6., 7., 8., 9., 10., 11.]]])2.Array data
NumPy的ndarray是很有效的,因為它們的所有元素必須具有相同的類型(通常是數字)。 您可以通過查看dtype屬性來檢查數據類型:
c = np.arange(1, 5) print(c.dtype, c) #輸出 " int64 [1 2 3 4]"c = np.arange(1.0, 5.0) print(c.dtype, c) #輸出 " float64 [1. 2. 3. 4.]"#創建數組時指定元素類型(復數) d = np.arange(1, 5, dtype=np.complex64) print(d.dtype, d) #輸出 " complex64 [1.+0.j 2.+0.j 3.+0.j 4.+0.j]"查看這篇文檔了解所有的元素類型。
#itemsize屬性返回每個項的大小(以字節為單位): e = np.arange(1, 5, dtype=np.complex64) e.itemsize #輸出 "8"#查看數組的存儲地址 f = np.array([[1,2],[1000, 2000]], dtype=np.int32) f.data#輸出 <read-write buffer for 0x7f53b05ab850, size 16, offset 0 at 0x7f53b267aa70>3.Reshaping an array
更改ndarray的形狀就像設置其shape屬性一樣簡單。 但是,陣列的大小必須保持不變。
g = np.arange(24) print(g) print("Rank:", g.ndim)#輸出 [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23] Rank: 1g.shape = (6, 4) print(g) print("Rank:", g.ndim)#輸出 [[ 0 1 2 3][ 4 5 6 7][ 8 9 10 11][12 13 14 15][16 17 18 19][20 21 22 23]] Rank: 2g.shape = (2, 3, 4) print(g) print("Rank:", g.ndim)#輸出 [[[ 0 1 2 3][ 4 5 6 7][ 8 9 10 11]][[12 13 14 15][16 17 18 19][20 21 22 23]]] Rank: 31)reshape and ravel
reshape函數返回指向相同數據的新ndarray對象。 這意味著修改一個數組也會修改另一個數組。
g2 = g.reshape(4,6) print(g2) print("Rank:", g2.ndim)#輸出 [[ 0 1 2 3 4 5][ 6 7 8 9 10 11][12 13 14 15 16 17][18 19 20 21 22 23]] Rank: 2#修改矩陣g2中的元素 g2[1, 2] = 999 g2 array([[ 0, 1, 2, 3, 4, 5],[ 6, 7, 999, 9, 10, 11],[ 12, 13, 14, 15, 16, 17],[ 18, 19, 20, 21, 22, 23]])g array([[[ 0, 1, 2, 3],[ 4, 5, 6, 7],[999, 9, 10, 11]],[[ 12, 13, 14, 15],[ 16, 17, 18, 19],[ 20, 21, 22, 23]]])#最后,ravel函數返回一個新的一維ndarray,它也指向相同的數據: g.ravel() array([ 0, 1, 2, 3, 4, 5, 6, 7, 999, 9, 10, 11, 12,13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23])4.Arithmetic operations
下面介紹關于ndarrays數組的幾何運算:
a = np.array([14, 23, 32, 41]) b = np.array([5, 4, 3, 2]) print("a + b =", a + b) print("a - b =", a - b) print("a * b =", a * b) print("a / b =", a / b) print("a // b =", a // b) print("a % b =", a % b) print("a ** b =", a ** b)#輸出 a + b = [19 27 35 43] a - b = [ 9 19 29 39] a * b = [70 92 96 82] a / b = [ 2.8 5.75 10.66666667 20.5 ] a // b = [ 2 5 10 20] a % b = [4 3 2 1] a ** b = [537824 279841 32768 1681]注意,這里的乘法不是線性代數里的矩陣乘法。 我們將在下面討論矩陣運算。陣列必須具有相同的形狀。 如果他們形狀不一樣,NumPy將應用廣播規則。
5.Broadcasting
通常,當NumPy期望操作的數組形狀相同時但發現情況并非如此時,它會應用所謂的廣播規則.
1)廣播規則
#3維數組+1維數組 h = np.arange(5).reshape(1, 1, 5) harray([[[0, 1, 2, 3, 4]]])#現在加上一維數組 h + [10, 20, 30, 40, 50] # same as: h + [[[10, 20, 30, 40, 50]]]array([[[10, 21, 32, 43, 54]]])#不同形狀的2維數組相加 k = np.arange(6).reshape(2, 3) karray([[0, 1, 2],[3, 4, 5]])k + [[100], [200]] # same as: k + [[100, 100, 100], [200, 200, 200]]array([[100, 101, 102],[203, 204, 205]])#我們還可以進行如下操作 k + [100, 200, 300] # after rule 1: [[100, 200, 300]], and after rule 2: [[100, 200, 300], [100, 200, 300]]array([[100, 201, 302],[103, 204, 305]])k + 1000 # same as: k + [[1000, 1000, 1000], [1000, 1000, 1000]] array([[1000, 1001, 1002],[1003, 1004, 1005]])#數組的size必須匹配,下面是不匹配的例子 try:k + [33, 44] except ValueError as e:print(e)operands could not be broadcast together with shapes (2,3) (2,)下面來看一個不同類型的數組廣播的例子
k1 = np.arange(0, 5, dtype=np.uint8) print(k1.dtype, k1)uint8 [0 1 2 3 4]k3 = k1 + 1.5 print(k3.dtype, k3)float64 [1.5 2.5 3.5 4.5 5.5]6.Conditional operators
下面看幾個條件運算符在數組中應用的例子:
m = np.array([20, -5, 30, 40]) m < [15, 16, 35, 36]array([False, True, True, False])m < 25 # equivalent to m < [25, 25, 25, 25] array([ True, True, False, False])#這與布爾索引一起使用時最有用 m[m < 25] array([20, -5])7.Mathematical and statistical functions
在numpy數組中有許多關于統計學的函數。
1)ndarray?methods
#計算數組平均數 a = np.array([[-2.5, 3.1, 7], [10, 11, 12]]) print(a) print("mean =", a.mean())#輸出 [[-2.5 3.1 7. ][10. 11. 12. ]] mean = 6.766666666666667#實用函數 for func in (a.min, a.max, a.sum, a.prod, a.std, a.var):print(func.__name__, "=", func())#輸出 min = -2.5 max = 12.0 sum = 40.6 prod = -71610.0 std = 5.084835843520964 var = 25.855555555555554#下面的函數接受一個可選的參數軸,該軸允許您請求對給定軸上的元素執行操作 c=np.arange(24).reshape(2,3,4) c array([[[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]],[[12, 13, 14, 15],[16, 17, 18, 19],[20, 21, 22, 23]]])c.sum(axis=0) # sum across matrices array([[12, 14, 16, 18],[20, 22, 24, 26],[28, 30, 32, 34]])c.sum(axis=1) # 安列求和array([[12, 15, 18, 21],[48, 51, 54, 57]])c.sum(axis=(0,2)) # sum across matrices and columns array([ 60, 92, 124])2)Universal functions
NumPy還提供稱為通用函數或ufunc的快速元素函數。 它們是簡單函數的矢量化包裝器。 例如,square返回一個新的ndarray,它是原始ndarray的副本,除了每個元素都是平方的。
a = np.array([[-2.5, 3.1, 7], [10, 11, 12]]) np.square(a)array([[ 6.25, 9.61, 49. ],[100. , 121. , 144. ]])print("Original ndarray") print(a) for func in (np.abs, np.sqrt, np.exp, np.log, np.sign, np.ceil, np.modf, np.isnan, np.cos):print("\n", func.__name__)print(func(a))Original ndarray [[-2.5 3.1 7. ][10. 11. 12. ]]absolute [[ 2.5 3.1 7. ][10. 11. 12. ]]sqrt [[ nan 1.76068169 2.64575131][3.16227766 3.31662479 3.46410162]]exp [[8.20849986e-02 2.21979513e+01 1.09663316e+03][2.20264658e+04 5.98741417e+04 1.62754791e+05]]log [[ nan 1.13140211 1.94591015][2.30258509 2.39789527 2.48490665]]sign [[-1. 1. 1.][ 1. 1. 1.]]ceil [[-2. 4. 7.][10. 11. 12.]]modf (array([[-0.5, 0.1, 0. ],[ 0. , 0. , 0. ]]), array([[-2., 3., 7.],[10., 11., 12.]]))isnan [[False False False][False False False]]cos [[-0.80114362 -0.99913515 0.75390225][-0.83907153 0.0044257 0.84385396]]3)Binary ufuncs
a = np.array([1, -2, 3, 4]) b = np.array([2, 8, -1, 7]) np.add(a, b) # equivalent to a + barray([ 3, 6, 2, 11])np.greater(a, b) # equivalent to a > barray([False, False, True, False])np.maximum(a, b)array([2, 8, 3, 7])np.copysign(a, b)array([ 1., 2., -3., 4.])8.Array indexing
1維numpy數組可以像常規的python數組那樣來訪問。
a = np.array([1, 5, 3, 19, 13, 7, 3]) a[3] #輸出 “19”a[2:5] #輸出 “array([ 3, 19, 13])”a[2:-1] #輸出 “array([ 3, 19, 13, 7])”a[:2] #輸出 “array([1, 5])”#修改元素值 a[3]=999 a #輸出 “array([ 1, 5, 3, 999, 13, 7, 3])”#修改ndarray切片 a[2:5] = [997, 998, 999] a #輸出 “array([ 1, 5, 997, 998, 999, 7, 3])”1)Differences with regular python arrays
與常規python數組相反,如果您將單個值分配給ndarray切片,則會將其復制到整個切片中,這要歸功于上面討論的廣播規則。
a[2:5] = -1 a #輸出 "array([ 1, 5, -1, -1, -1, 7, 3])"#創建切片并對其進行修改,實際上也將修改原始的ndarray. a_slice = a[2:6] a_slice[1] = 1000 a #輸出 "array([ 1, 5, -1, 1000, -1, 7, 3])"#同樣地,修改原始數組元素,切片中的元素也會修改 a[3] = 2000 a_slice #輸出 "array([ -1, 2000, -1, 7])" #使用copy()函數來復制數據 another_slice = a[2:6].copy() another_slice[1] = 3000 a #輸出 "array([ 1, 5, -1, 2000, -1, 7, 3])"2)Multi-dimensional arrays
通過為每個軸提供索引或切片,以逗號分隔,可以以類似的方式訪問多維數組。
b = np.arange(48).reshape(4, 12) b#輸出 array([[ 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, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35],[36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47]])b[1, 2] #輸出 "14"#輸出第2行所有元素 b[1, :] #輸出 "array([12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23])"#輸出第1列所有元素 b[:, 1] #輸出 "array([ 1, 13, 25, 37])"#注意下面兩個兩個表達式的區別 b[1, :] #輸出 "array([12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23])" b[1:2, :] #輸出 "array([[12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]])"3) Fancy indexing &Higher dimensions&Boolean indexing
我們的索引也可以是列表形式來訪問多維數組
#切片前兩行,2-4列的元素 b[(0,2), 2:5] #輸出 array([[ 2, 3, 4],[26, 27, 28]])b[:, (-1, 2, -1)] #輸出 array([[11, 2, 11],[23, 14, 23],[35, 26, 35],[47, 38, 47]])#返回一維數組 b[(-1, 2, -1, 2), (5, 9, 1, 9)] #輸出“array([41, 33, 37, 33])”#構建高維數組 c = b.reshape(4,2,6) c#輸出 array([[[ 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, 25, 26, 27, 28, 29],[30, 31, 32, 33, 34, 35]],[[36, 37, 38, 39, 40, 41],[42, 43, 44, 45, 46, 47]]])c[2, 1, 4] #輸出 "34" c[2, :, 3] #輸出 "array([27, 33])"#如果省略某些軸的坐標,則返回這些軸中的所有元素 c[2, 1] #輸出 "array([30, 31, 32, 33, 34, 35])"#省略號的使用 c[2, ...] #c[2:, :, :] #輸出 array([[24, 25, 26, 27, 28, 29],[30, 31, 32, 33, 34, 35]])c[2, 1, ...] #c[2, 1, :] #輸出 array([30, 31, 32, 33, 34, 35])c[2, ..., 3] #c[2, :, 3] array([27, 33]) c[..., 3] #c[:, :, 3] #輸出 array([[ 3, 9],[15, 21],[27, 33],[39, 45]])#布爾索引 b = np.arange(48).reshape(4, 12) b array([[ 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, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35],[36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47]])rows_on = np.array([True, False, True, False]) b[rows_on, :] #b[(0, 2), :] array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],[24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]])cols_on = np.array([False, True, False] * 4) b[:, cols_on] array([[ 1, 4, 7, 10],[13, 16, 19, 22],[25, 28, 31, 34],[37, 40, 43, 46]])#ix_函數使用 b[np.ix_(rows_on, cols_on)] array([[ 1, 4, 7, 10],[25, 28, 31, 34]])np.ix_(rows_on, cols_on) (array([[0],[2]]), array([[ 1, 4, 7, 10]]))b[b % 3 == 1] array([ 1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46])9.Iterating
bn遍歷arrays非常類似于遍歷常規python數組。 但是完成的是對多維數組的遍歷。
#生成一個三維數組 c = np.arange(24).reshape(2, 3, 4) c#輸出 array([[[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]],[[12, 13, 14, 15],[16, 17, 18, 19],[20, 21, 22, 23]]])for m in c:print("Item:")print(m)#輸出 Item: [[ 0 1 2 3][ 4 5 6 7][ 8 9 10 11]] Item: [[12 13 14 15][16 17 18 19][20 21 22 23]]#len(c) == c.shape[0] for i in range(len(c)): print("Item:")print(c[i])#輸出 Item: [[ 0 1 2 3][ 4 5 6 7][ 8 9 10 11]] Item: [[12 13 14 15][16 17 18 19][20 21 22 23]]#通過flat屬性遍歷所有元素 for i in c.flat:print("Item:", i) Item: 0 Item: 1 Item: 2 Item: 3 Item: 4 Item: 5 Item: 6 Item: 7 Item: 8 Item: 9 Item: 10 Item: 11 Item: 12 Item: 13 Item: 14 Item: 15 Item: 16 Item: 17 Item: 18 Item: 19 Item: 20 Item: 21 Item: 22 Item: 2310.Stacking arrays
將不同的數組堆疊在一起通常很有用。 NumPy提供了幾種功能來實現這一目標。 讓我們從創建一些數組開始。
#創建數組q1,q2,q3 q1 = np.full((3,4), 1.0) q1array([[1., 1., 1., 1.],[1., 1., 1., 1.],[1., 1., 1., 1.]])q2 = np.full((4,4), 2.0) q2array([[2., 2., 2., 2.],[2., 2., 2., 2.],[2., 2., 2., 2.],[2., 2., 2., 2.]])q3 = np.full((3,4), 3.0) q3array([[3., 3., 3., 3.],[3., 3., 3., 3.],[3., 3., 3., 3.]])1)vstack
現在使用vstack函數來堆疊數組:
q4 = np.vstack((q1, q2, q3)) q4array([[1., 1., 1., 1.],[1., 1., 1., 1.],[1., 1., 1., 1.],[2., 2., 2., 2.],[2., 2., 2., 2.],[2., 2., 2., 2.],[2., 2., 2., 2.],[3., 3., 3., 3.],[3., 3., 3., 3.],[3., 3., 3., 3.]])q4.shape (10, 4)2)hstack
同樣,我們也可以在水平方向上堆疊數組:
q5 = np.hstack((q1, q3)) q5array([[1., 1., 1., 1., 3., 3., 3., 3.],[1., 1., 1., 1., 3., 3., 3., 3.],[1., 1., 1., 1., 3., 3., 3., 3.]])q5.shape (3, 8)3)concatenate
concatenate函數沿任何給定的現有軸堆棧數組。
q7 = np.concatenate((q1, q2, q3), axis=0) # axis=0 == vstack q7array([[1., 1., 1., 1.],[1., 1., 1., 1.],[1., 1., 1., 1.],[2., 2., 2., 2.],[2., 2., 2., 2.],[2., 2., 2., 2.],[2., 2., 2., 2.],[3., 3., 3., 3.],[3., 3., 3., 3.],[3., 3., 3., 3.]])q7.shape (10, 4)4)stack
stack函數沿新軸堆疊數組。 所有陣列必須具有相同的形狀。
q8 = np.stack((q1, q3)) q8array([[[1., 1., 1., 1.],[1., 1., 1., 1.],[1., 1., 1., 1.]],[[3., 3., 3., 3.],[3., 3., 3., 3.],[3., 3., 3., 3.]]])q8.shape (2, 3, 4)11.Splitting arrays
分裂與堆疊相反。 例如,讓我們使用vsplit函數垂直分割矩陣。首先讓我們創建一個6x4矩陣:
r = np.arange(24).reshape(6,4) rarray([[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11],[12, 13, 14, 15],[16, 17, 18, 19],[20, 21, 22, 23]])#現在開始把數組平分三份 r1, r2, r3 = np.vsplit(r, 3) r1array([[0, 1, 2, 3],[4, 5, 6, 7]])r3 array([[16, 17, 18, 19],[20, 21, 22, 23]])#水平方向平分數組 r4, r5 = np.hsplit(r, 2) r4 array([[ 0, 1],[ 4, 5],[ 8, 9],[12, 13],[16, 17],[20, 21]])12.Transposing arrays
轉置方法在ndarray的數據上創建一個新視圖,以給定的順序進行置換。例如,讓我們創建一個3D數組:
t = np.arange(24).reshape(4,2,3) tarray([[[ 0, 1, 2],[ 3, 4, 5]],[[ 6, 7, 8],[ 9, 10, 11]],[[12, 13, 14],[15, 16, 17]],[[18, 19, 20],[21, 22, 23]]])#我們創建一個ndarray,使軸依次向左平移 t1 = t.transpose((1,2,0)) t1array([[[ 0, 6, 12, 18],[ 1, 7, 13, 19],[ 2, 8, 14, 20]],[[ 3, 9, 15, 21],[ 4, 10, 16, 22],[ 5, 11, 17, 23]]]) t1.shape (2, 3, 4)#默認情況下,轉置會反轉維度的順序: t2 = t.transpose() t2 array([[[ 0, 6, 12, 18],[ 3, 9, 15, 21]],[[ 1, 7, 13, 19],[ 4, 10, 16, 22]],[[ 2, 8, 14, 20],[ 5, 11, 17, 23]]])t2.shape (3, 2, 4)#NumPy提供便捷功能交換軸來交換兩個軸 t3 = t.swapaxes(0,1) t3array([[[ 0, 1, 2],[ 6, 7, 8],[12, 13, 14],[18, 19, 20]],[[ 3, 4, 5],[ 9, 10, 11],[15, 16, 17],[21, 22, 23]]])t3.shape (2, 4, 3)13.Vectorization
Numpy最有用的是向量化。 這可以讓我避免顯示使用for循環。來看下面這個例子:
import math data = np.empty((768, 1024)) for y in range(768):for x in range(1024):data[y, x] = math.sin(x*y/40.5) # 非常低效#我們向量化創建數組 x_coords = np.arange(0, 1024) # [0, 1, 2, ..., 1023] y_coords = np.arange(0, 768) # [0, 1, 2, ..., 767] X, Y = np.meshgrid(x_coords, y_coords) X array([[ 0, 1, 2, ..., 1021, 1022, 1023],[ 0, 1, 2, ..., 1021, 1022, 1023],[ 0, 1, 2, ..., 1021, 1022, 1023],...,[ 0, 1, 2, ..., 1021, 1022, 1023],[ 0, 1, 2, ..., 1021, 1022, 1023],[ 0, 1, 2, ..., 1021, 1022, 1023]])Y array([[ 0, 0, 0, ..., 0, 0, 0],[ 1, 1, 1, ..., 1, 1, 1],[ 2, 2, 2, ..., 2, 2, 2],...,[765, 765, 765, ..., 765, 765, 765],[766, 766, 766, ..., 766, 766, 766],[767, 767, 767, ..., 767, 767, 767]])#X和Y都是768x1024維數組,現在我們進行數組運算 data = np.sin(X*Y/40.5) #顯示圖形 import matplotlib.pyplot as plt import matplotlib.cm as cm fig = plt.figure(1, figsize=(7, 6)) plt.imshow(data, cmap=cm.hot, interpolation="bicubic") plt.show()14.Saving and loading
Numpy提供了很多方式保存數組:
#創建一個隨機數組,然后保存 a = np.random.rand(2,3) aarray([[0.13173958, 0.18005176, 0.26791744],[0.74531068, 0.07925457, 0.02683962]])#自動保存為.npy格式 np.save("my_array", a)#打開剛剛保存的數組文件 with open("my_array.npy", "rb") as f:content = f.read()contenta_loaded = np.load("my_array.npy") a_loaded array([[0.13173958, 0.18005176, 0.26791744],[0.74531068, 0.07925457, 0.02683962]])#Text format np.savetxt("my_array.csv", a) with open("my_array.csv", "rt") as f:print(f.read())1.317395793717837105e-01 1.800517644099779435e-01 2.679174359928241378e-01 7.453106759162891892e-01 7.925457061278873283e-02 2.683962400554706917e-02#設置逗號分隔符 np.savetxt("my_array.csv", a, delimiter=",") a_loaded = np.loadtxt("my_array.csv", delimiter=",") a_loadedarray([[0.13173958, 0.18005176, 0.26791744],[0.74531068, 0.07925457, 0.02683962]])#Zipped .npz formatb = np.arange(24, dtype=np.uint8).reshape(2, 3, 4) barray([[[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]],[[12, 13, 14, 15],[16, 17, 18, 19],[20, 21, 22, 23]]], dtype=uint8)np.savez("my_arrays", my_a=a, my_b=b)with open("my_arrays.npz", "rb") as f:content = f.read()repr(content)[:180] + "[...]"#加載文件 my_arrays = np.load("my_arrays.npz") my_arraysmy_arrays.keys() ['my_b', 'my_a']my_arrays["my_a"] array([[0.13173958, 0.18005176, 0.26791744],[0.74531068, 0.07925457, 0.02683962]])綜上,我們已經學完了Numpy的基本使用,在下一篇文章中將介紹如何使用Numpy進行線性代數運算。
總結
以上是生活随笔為你收集整理的Python之Numpy入门实战教程(1):基础篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: owmngr.exe - owmngr是
- 下一篇: python 协程池gevent.poo