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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

常量数组 python_python数据科学系列:numpy入门详解教程

發布時間:2025/3/15 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 常量数组 python_python数据科学系列:numpy入门详解教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

python數據科學基礎庫主要是三劍客:numpy,pandas以及matplotlib,每個庫都集成了大量的方法接口,配合使用功能強大。平時雖然一直在用,也看過很多教程,但紙上得來終覺淺,還是需要自己系統梳理總結才能印象深刻。本篇先從numpy開始,對numpy常用的方法進行思維導圖式梳理,多數方法僅拉單列表,部分接口輔以解釋說明及代碼案例。最后分享了個人關于axis和廣播機制的理解。

01 基本介紹

  • numpy:numerical python縮寫,提供了底層基于C語言實現的數值計算庫,與python內置的list和array數據結構相比,其支持更加規范的數據類型和極其豐富的操作接口,速度也更快
  • numpy的兩個重要對象是ndarray和ufunc,其中前者是數據結構的基礎,后者是接口方法的基礎
  • ufunc,通函數,其意義是可以像執行標量運算一樣執行數組運算,本質即是通過隱式的循環對各個位置依次進行標量運算。只不過這里的隱式循環交由底層C語言實現,因此相比直接用python循環實現,ufunc語法更為簡潔、效率更為高效
  • 索引、迭代和切片操作方式與普通列表比較類似,但是支持更為強大的bool索引

這部分內容比較基礎,僅補充一個個人認為比較有用的ufunc加聚合的例子。ufunc本身屬于方法(方法即是類內的函數接口),ufunc之上還支持4個方法:

  • reduce,聚合方法
  • accumulate,累計聚合
  • reduceat,按指定軸向、指定切片聚合
  • outer:外積

當然,后兩個用處較少也不易理解,前兩個在有些場景下則比較有用:

02 數組創建

numpy中支持5類創建數組的方式:

  • 從普通數據結構創建,如列表、元組等
  • 從特定的array結構創建,支持大量方法,例如ones、zeros、empty等等
    • empty接收指定大小創建空數組,這里空數組的意義在于未進行數值初始賦值,隨機產生,因而速度要更快一些
    • linspace和arange功能類似,前者創建指定個數的數值,后者按固定步長創建,其中linspace默認包含終點值(可以通過endpoint參數設置為false),而arange則不含終點
  • 從磁盤讀取特定的文件格式
  • 從緩存或字符讀入數組
  • 從特定的庫函數創建,例如random隨機數包
    以上方法中,最為常用的是方法1、2、5。

03 數組增刪

numpy提供了與列表類似的增刪操作,其中

  • append是在指定維度后面拼接數據,要求相應維度大小匹配
  • insert可以在指定維度任意位置插入數據,要求維度大小匹配
  • delete刪除指定維度下的特定索引對應數據

三種方法需要接收一個axis參數,如果未指定,則均會先對目標數組展平至一維數組后再執行相應操作。

04 數組變形

數組變形是指對給定數組重新整合各維度大小的過程,numpy封裝了4類基本的變形操作:轉置、展平、尺寸重整和復制。主要方法接口如下:

  • reshape常用于對給定數組指定維度大小,原數組不變,返回一個具有新形狀的新數組;如果想對原數組執行inplace變形操作,則可以直接指定其形狀為合適維度

  • resize與reshape功能類似,主要有3點區別:
    • resize面向對象操作時,執行inplace操作,調用np.resize類方法時則不改變原數組形狀;而reshape無論如何都不改變原數組形狀
    • resize變形后的數組大小可以不和原數組一致,會自動根據新尺寸情況進行截斷或拼接
    • 正因為resize可以執行截斷,所以要求接收確切的尺寸參數,不允許出現-1這樣的"非法"數值;而reshape中常用-1的技巧實現某一維度的自動計算

另外,當resize新尺寸參數與原數組大小不一致時,要求操作對象具有原數組的,而不能是view或簡單賦值。(具體參考08 視圖與拷貝一節)

  • ravel和flat功能類似,均返回對數組執行展平后的結果,且不改變原數組形狀,區別在于:
    • 前者是方法接口,而后者是屬性接口,
    • 前者返回對象類型仍然是數組,而后者返回對象類型是專用的flatten類型,一般用作迭代器對象
  • transpose與T均執行轉置操作,前者是方法,后者是屬性
  • tile和repeat方法類似,均為對給定數組執行復制操作,區別在于:
    • tile面向整個數組復制,而repeat面向數組元素復制
    • tile不接收維度參數,而repeat需指定維度參數,否則會對數組先展平再復制

05 數組拼接

數組拼接也是常用操作之一,主要有3類接口:

  • concatenate,對給定的多個數組按某一軸進行拼接,要求所有數組具有相同的維度(ndim相等)、且在非拼接軸大小一致

  • stack系列,共6個方法:
    • hstack,column_stack:功能基本一致,均為水平堆疊(axis=1),或者說按列堆疊。唯一的區別在于在處理一維數組時:hstack按axis=0堆疊,且不要求兩個一維數組長度一致,堆疊后仍然是一個一維數組;而column_stack則會自動將兩個一維數組變形為Nx1的二維數組,并仍然按axis=1堆疊,自然也就要求二者長度一致,堆疊后是一個Nx2的二維數組

    • vstack,row_stack,功能一致,均為垂直堆疊,或者說按行堆疊,axis=0
    • dstack,主要面向三維數組,執行axis=2方向堆疊,輸入數組不足3維時會首先轉換為3維,主要適用于圖像處理等領域
    • stack,進行升維堆疊,執行效果與前幾種堆疊方式基本不同,要求所有數組必須具有相同尺寸。堆疊后,一維變二維、二維變三維……
  • 魔法方法:r_[ ],c_[ ],效果分別與row_stack和column_stack類似,但具體語法要求略有不同。另外,雖然不是函數,但第一個參數可以是一個字符串實現特定功能設置。

06 數組切分

數組切分可以看做是數組拼接的逆操作,分別對應:

  • hsplit:水平切分,要求切分后大小相等,維數不變,可以切分一維數組
  • vsplit:垂直切分,要求切分后大小相等,維數不變,要求至少二維以上
  • dsplit:縱深切分,要求切分后大小相等,維數不變,至少三維數組
  • split:通過接收一個axis參數實現任意切分,默認axis=0,若設置axis=1或2則可分別實現vstack和dstack
  • array_split:前面4個方法均要求實現相同大小的子數組切分,當切分份數無法實現整除時會報錯。array_split則可以適用于近似相等條件下的切分,也接受一個axis參數實現指定軸向

07 基本統計量

numpy可以很方便的實現基本統計量,而且每種方法均包括對象方法和類方法:

  • max,argmax分別返回最大值和最大值對應索引,可接收一個axis參數,指定軸線的聚合統計。對于二維及以上數組,若不指定axis,即axis=None,此時對數組所有數值求聚合統計
  • min,argmin,與最大一致
  • mean、std,分別求均值和標準差,也可接收一個缺省參數axis實現特定軸向聚合統計或全局聚合
  • var、cov,分別求方差和協方差,與均值標準差類似
  • sort、argsort,分別返回排序后的數組和相應索引,接收一個axis參數,默認為axis=-1,按最后一個軸向,若axis=None表示先展平成一維數組后再排序;另外可設置排序算法,如快排、堆排或歸并等

08 視圖與拷貝

與列表的操作類似,numpy的數組類型也存在深淺拷貝之分:

  • 直接賦值:無拷貝,相當于是引用
  • view():建立視圖,淺拷貝,形狀可以不一致,但數據相同
  • copy():深拷貝,完全獨立的對象

注:正因為賦值和view操作后兩個數組的數據共享,所以在前面resize試圖更改數組形狀時可以執行、但更改元素個數時會報錯。

09 特殊常量

numpy提供了一些特殊的常量,值得注意的是np.newaxis可以用作是對數組執行升維操作,效果與設置為None一致。

10 隨機數包

Random是numpy下的一個子包,內置了大量的隨機數方法接口,包括絕大部分概率分布接口,常用的主要還是均勻分布和正態分布:

  • 均勻分布:random、rand、uniform,三者功能具有相似性,其中前兩者均產生指定個數的0-1之間均勻分布,而uniform可通過設置參數實現任意區間的均勻分布;當需要產生整數均勻分布時,可用randint

  • 正態分布:randn,normal,前者生成標準正態分布(均值為0,方差為1),后者產生任意正態分布,接收一個loc參數作為均值,scale參數作為標準差

  • permutation、shuffle,對給定序列實現隨機排列,前者返回一個新數組,后者是inplace操作
  • seed,因為計算機中的隨機數嚴格講都是偽隨機,需要依賴一個隨機數種子來不斷生成新的隨機數,seed可以用于固定這個隨機種子。當指定隨機數種子后,后續的隨機將得到固化

11 線性代數包

除了隨機數包,numpy下的另一個常用包是線性代數包,常見的矩陣操作均位于此包下。由于點積dot()和向量點積vdot()操作使用較為頻繁,所以全局可用。

12 關于axis的理解

由于numpy的基本數據結構是多維數組,很多接口方法均存在維度的問題,按照不同維度執行操作結果往往不同,例如拼接、拆分、聚合統計等,此時一般需要設置一個維度參數,即axis。由于很多教程因為翻譯或語言習慣不同,存在眾說紛紜、口徑不一的問題,有的說axis=0是橫軸,有的說是縱向,所以如何理解axis的含義可能是很多numpy初學者的常見困擾之一,筆者也是如此。

這一問題困擾了好久,直至一次無意間看到了相關源碼中的注釋:

例如,在sort方法中,axis參數的解釋為"Axis along which to sort",翻譯過來就是沿著某一軸執行排序。這里的沿著一詞用得恰到好處,形象的描述了參數axis的作用,即相關操作是如何與軸向建立聯系的,在具體解釋之前,先介紹下axis從小到大的順序問題。axis從小到大對應軸的出場順序先后,或者說變化快慢:axis=0對應主軸,沿著行變化的方向,可以理解為在多重for循環中最外面的一層,對應行坐標,數值變化最慢;而axis=1對應次軸,沿著列變化的方向,在多重for循環中變化要快于axis=0的軸向。類似地,如果有更高維度則依次遞增。

至此,再來理解這里axis沿著的意義。舉個例子,axis=0代表沿著行變化的方向,那么自然地,切分方法split(axis=0)接口對應vsplit,因為是對行切分,即垂直切分;而split(axis=1)接口則對應hsplit,因為是對列切分,即水平切分;split(axis=2)則對應dsplit。類似的,np.sort(axis=0)必然是沿著行方向排序,也就是分別對每一列執行排序。

想必這樣理解,應該不會存在混淆了。

13 關于廣播機制

可能困擾numpy初學者的另一個用法是numpy的一大利器:廣播機制。廣播機制是指執行ufunc方法(即對應位置元素1對1執行標量運算)時,可以確保在數組間形狀不完全相同時也可以自動的通過廣播機制擴散到相同形狀,進而執行相應的ufunc方法。

當然,這里的廣播機制是有條件的:

條件很簡單,即從兩個數組的最后維度開始比較,如果該維度滿足維度相等或者其中一個大小為1,則可以實現廣播。當然,維度相等時相當于未廣播,所以嚴格的說廣播僅適用于某一維度從1廣播到N;如果當前維度滿足廣播要求,則同時前移一個維度繼續比較。

為了直觀理解這個廣播條件,舉個例子,下面的情況均滿足廣播條件:

而如下例子則無法完成廣播:

好吧,以上例子其實都源自numpy官方文檔。具體可參考../numpy/doc/Broadcasting.py文件。另外,doc包下還包括很多說明文檔,對于深刻理解numpy運行機制大有裨益。

再補充一句:這里或許有人好奇,為什么必須要1對N才能廣播,N的任意因數(比如N/2、N/3等)不是都可以"合理"廣播到N嗎?對此,個人也曾有此困惑,我的理解是這里的合理只是數學意義下的合理,但數組表征值意義下往往不合理,因為缺乏解釋性!比如2可以廣播到12,但此時該怎樣理解這其中的廣播意義呢?奇偶不同?那3廣播到12呢?4廣播到12呢?還是欠缺解釋性。所以numpy限制必須是1廣播到N或者二者相等,才可以廣播。

來自:小數志

總結

以上是生活随笔為你收集整理的常量数组 python_python数据科学系列:numpy入门详解教程的全部內容,希望文章能夠幫你解決所遇到的問題。

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