日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NumPy简明教程(二、数组2)

發布時間:2025/3/15 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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?#?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[0:6:2]=?-1000,從開始到第6個位置,每隔一個元素將其賦值為-1000??
  • >>>?a??
  • array([-1000,?1,-1000,?27,-1000,?125,?216,?343,?512,?729])??
  • >>>?a[:?:-1]?#?反轉a??
  • 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)?#fromfunction是一個函數,下篇文章介紹。??
  • >>>?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]?#?最后一行,等同于b[-1,:],-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],?#三維數組(兩個2維數組疊加而成)??
  • ...[?10,?12,?13]],??
  • ...??
  • ...[[100,101,102],??
  • ...[110,112,113]]]?)??
  • >>>?c.shape??
  • ?(2,?2,?3)??
  • >>>?c[1,...]?#等同于c[1,:,:]或c[1]??
  • array([[100,?101,?102],??
  • ???????????[110,?112,?113]])??
  • >>>?c[...,2]?#等同于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)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。