生活随笔
收集整理的這篇文章主要介紹了
NumPy简明教程(二、数组2)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
NumPy數組(2、數組的操作)
基本運算
數組的算術運算是按元素逐個運算。數組運算后將創建包含運算結果的新數組。
[python]?view plain
?copy >>>?a=?np.array([20,30,40,50])?? >>>?b=?np.arange(?4)?? >>>?b?? array([0,?1,?2,?3])?? >>>?c=?a-b?? >>>?c?? array([20,?29,?38,?47])?? >>>?b**2?? array([0,?1,?4,?9])?? >>>?10*np.sin(a)?? array([?9.12945251,-9.88031624,?7.4511316,?-2.62374854])?? >>>?a<35?? array([True,?True,?False,?False],?dtype=bool)??
與其他矩陣語言不同,NumPy中的乘法運算符*按元素逐個計算,矩陣乘法可以使用dot函數或創建矩陣對象實現(后續章節會介紹)
[python]?view plain
?copy >>>?A=?np.array([[1,1],?? ...[0,1]])?? >>>?B=?np.array([[2,0],?? ...[3,4]])?? >>>?A*B??? array([[2,?0],?? ???? ?[0,?4]])?? >>>?np.dot(A,B)??? array([[5,?4],?? ???? ?[3,?4]])??
有些操作符如+=和*=用來更改已存在數組而不創建一個新的數組。
[python]?view plain
?copy >>>?a=?np.ones((2,3),?dtype=int)?? >>>?b=?np.random.random((2,3))?? >>>?a*=?3?? >>>?a?? array([[3,?3,?3],?? ???? ?[3,?3,?3]])?? >>>?b+=?a?? >>>?b?? array([[?3.69092703,?3.8324276,?3.0114541],?? ???? ?[?3.18679111,?3.3039349,?3.37600289]])?? >>>?a+=?b??? >>>?a?? array([[6,?6,?6],?? ???????????[6,?6,?6]])??
當數組中存儲的是不同類型的元素時,數組將使用占用更多位(bit)的數據類型作為其本身的數據類型,也就是偏向更精確的數據類型(這種行為叫做upcast)。
[python]?view plain
?copy >>>?a=?np.ones(3,?dtype=np.int32)?? >>>?b=?np.linspace(0,np.pi,3)?? >>>?b.dtype.name?? 'float64'?? >>>?c=?a+b?? >>>?c?? array([?1.,?2.57079633,?4.14159265])?? >>>?c.dtype.name?? 'float64'?? >>>?d=?exp(c*1j)?? >>>?d?? array([?0.54030231+0.84147098j,-0.84147098+0.54030231j,?? ???? ?-0.54030231-0.84147098j])?? >>>?d.dtype.name?? 'complex128'??
許多非數組運算,如計算數組所有元素之和,都作為ndarray類的方法來實現,使用時需要用ndarray類的實例來調用這些方法。
[python]?view plain
?copy >>>?a=?np.random.random((2,3))?? >>>?a?? array([[?0.65806048,?0.58216761,?0.59986935],?? ???????????[?0.6004008,?0.41965453,?0.71487337]])?? >>>?a.sum()?? ??3.5750261436902333?? >>>?a.min()?? ?????0.41965453489104032?? >>>?a.max()?? ?????0.71487337095581649??
這些運算將數組看作是一維線性列表。但可通過指定axis參數(即數組的行)對指定的軸做相應的運算:
[python]?view plain
?copy >>>?b=?np.arange(12).reshape(3,4)?? >>>?b?? array([[?0,?1,?2,?3],?? ???????????[?4,?5,?6,?7],?? ???????????[?8,?9,?10,?11]])?? >>>?b.sum(axis=0)??? array([12,?15,?18,?21])?? >>>?b.min(axis=1)??? array([0,?4,?8])?? >>>?b.cumsum(axis=1)??? array([[?0,?1,?3,?6],?? ???????????[?4,?9,?15,?22],?? ???????????[?8,?17,?27,?38]])??
索引,切片和迭代
和列表和其它Python序列一樣,一維數組可以進行索引、切片和迭代操作。
[python]?view plain
?copy >>>?a=?np.arange(10)**3??? >>>?a?? array([0,?1,?8,?27,?64,?125,?216,?343,?512,?729])?? >>>?a[2]?? 8?? >>>?a[2:5]?? array([?8,?27,?64])?? >>>?a[:6:2]=?-1000??? >>>?a?? array([-1000,?1,-1000,?27,-1000,?125,?216,?343,?512,?729])?? >>>?a[:?:-1]??? array([?729,?512,?343,?216,?125,-1000,?27,-1000,?1,-1000])?? >>>for?i?in?a:?? ...????print?i**(1/3.),?? ...?? nan?1.0?nan?3.0?nan?5.0?6.0?7.0?8.0?9.0??
多維數組可以每個軸有一個索引。這些索引由一個逗號分割的元組給出。
[python]?view plain
?copy >>>def?f(x,y):?? ...????return?10*x+y?? ...?? >>>?b=?np.fromfunction(f,(5,4),dtype=int)??? >>>?b?? array([[?0,?1,?2,?3],?? ???????????[10,?11,?12,?13],?? ???????????[20,?21,?22,?23],?? ???????????[30,?31,?32,?33],?? ???????????[40,?41,?42,?43]])?? >>>?b[2,3]?? 23?? >>>?b[0:5,?1]??? array([?1,?11,?21,?31,?41])?? >>>?b[:?,1]??? array([?1,?11,?21,?31,?41])?? >>>?b[1:3,:?]??? array([[10,?11,?12,?13],?? ???????????[20,?21,?22,?23]])??
當少于提供的索引數目少于軸數時,已給出的數值按秩的順序復制,確失的索引則默認為是整個切片:
[python]?view plain
?copy >>>?b[-1]??? array([40,?41,?42,?43])??
??? b[i]中括號中的表達式被當作i和一系列:,來代表剩下的軸。NumPy也允許你使用“點”像b[i,...]。
????點(…)代表許多產生一個完整的索引元組必要的分號。如果x是秩為5的數組(即它有5個軸),那么:
- x[1,2,…] 等同于 x[1,2,:,:,:], ?
- x[…,3] 等同于 x[:,:,:,:,3]
- x[4,…,5,:] 等同 x[4,:,:,5,:]
[python]?view plain
?copy >>>?c=?array(?[?[[?0,?1,?2],??? ...[?10,?12,?13]],?? ...?? ...[[100,101,102],?? ...[110,112,113]]]?)?? >>>?c.shape?? ?(2,?2,?3)?? >>>?c[1,...]??? array([[100,?101,?102],?? ???????????[110,?112,?113]])?? >>>?c[...,2]??? array([[?2,?13],?? ???????????[102,?113]])??
多維數組的遍歷是以是第一個軸為基礎的:
[python]?view plain
?copy >>>for?row?in?b:?? ...????print?row?? ...?? [0?1?2?3]?? [10?11?12?13]?? [20?21?22?23]?? [30?31?32?33]?? [40?41?42?43]??
如果想對數組中每個元素都進行處理,可以使用flat屬性,該屬性是一個數組元素迭代器:
[python]?view plain
?copy >>>for?element?in?b.flat:?? ...????print?element,?? ...?? 0?1?2?3?10?11?12?13?20?21?22?23?30?31?32?33?40?41?42?43??
更多關于[]、…、newaxis、ndenumerate、indices、index exp的內容請參考NumPy示例
形狀(shape)操作
更改數組的形狀
數組的形狀取決于其每個軸上的元素個數:
[python]?view plain
?copy >>>?a=?np.floor(10*np.random.random((3,4)))?? >>>?a?? array([[?7.,?5.,?9.,?3.],?? ???????????[?7.,?2.,?7.,?8.],?? ???????????[?6.,?8.,?3.,?2.]])?? >>>?a.shape?? (3,?4)??
可以用多種方式修改數組的形狀:
[python]?view plain
?copy >>>?a.ravel()??? array([?7.,?5.,?9.,?3.,?7.,?2.,?7.,?8.,?6.,?8.,?3.,?2.])?? >>>?a.shape=?(6,?2)?? >>>?a.transpose()?? array([[?7.,?9.,?7.,?7.,?6.,?3.],?? ???????????[?5.,?3.,?2.,?8.,?8.,?2.]])??
由ravel()展平的數組元素的順序通常是“C風格”的,就是以行為基準,最右邊的索引變化得最快,所以元素a[0,0]之后是a[0,1]。如果數組改變成其它形狀(reshape),數組仍然是“C風格”的。NumPy通常創建一個以這個順序保存數據的數組,所以ravel()通常不需要創建起調用數組的副本。但如果數組是通過切片其它數組或有不同尋常的選項時,就可能需要創建其副本。還可以同過一些可選參數函數讓reshape()和ravel()構建FORTRAN風格的數組,即最左邊的索引變化最快。
reshape函數改變調用數組的形狀并返回該數組,而resize函數改變調用數組自身。
[python]?view plain
?copy >>>?a?? array([[?7.,?5.],?? ???????????[?9.,?3.],?? ???????????[?7.,?2.],?? ???????????[?7.,?8.],?? ???????????[?6.,?8.],?? ???????????[?3.,?2.]])?? >>>?a.resize((2,6))?? >>>?a?? array([[?7.,?5.,?9.,?3.,?7.,?2.],?? ???????????[?7.,?8.,?6.,?8.,?3.,?2.]])??
如果在reshape操作中指定一個維度為-1,那么其準確維度將根據實際情況計算得到
更多關于shape、reshape、resize和ravel的內容請參考NumPy示例
參考文獻:
《NumPy for Beginner》
《Tentative NumPy Tutorial》
總結
以上是生活随笔為你收集整理的NumPy简明教程(二、数组2)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。