python數據科學系列:numpy入門詳細教程

2021-01-14 Python愛好者社區

轉自:小數志

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


本文知識要點一級菜單





numpy:numerical python縮寫,提供了底層基於C語言實現的數值計算庫,與python內置的list和array數據結構相比,其支持更加規範的數據類型和極其豐富的操作接口,速度也更快

numpy的兩個重要對象是ndarray和ufunc,其中前者是數據結構的基礎,後者是接口方法的基礎

ufunc,通函數,其意義是可以像執行標量運算一樣執行數組運算,本質即是通過隱式的循環對各個位置依次進行標量運算。只不過這裡的隱式循環交由底層C語言實現,因此相比直接用python循環實現,ufunc語法更為簡潔、效率更為高效

索引、迭代和切片操作方式與普通列表比較類似,但是支持更為強大的bool索引


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

reduce,聚合方法

accumulate,累計聚合

reduceat,按指定軸向、指定切片聚合

outer:外積


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





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


以上方法中,最為常用的是方法1、2、5。





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


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



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


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


    

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


點擊查看大圖









數組拼接也是常用操作之一,主要有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,進行升維堆疊,執行效果與前幾種堆疊方式基本不同,要求所有數組必須具有相同尺寸。堆疊後,一維變二維、二維變三維……






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

hsplit:水平切分,要求切分後大小相等,維數不變,可以切分一維數組

vsplit:垂直切分,要求切分後大小相等,維數不變,要求至少二維以上

dsplit:縱深切分,要求切分後大小相等,維數不變,至少三維數組

split:通過接收一個axis參數實現任意切分,默認axis=0,若設置axis=1或2則可分別實現vstack和dstack

array_split:前面4個方法均要求實現相同大小的子數組切分,當切分份數無法實現整除時會報錯。array_split則可以適用於近似相等條件下的切分,也接受一個axis參數實現指定軸向





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

max,argmax分別返回最大值和最大值對應索引,可接收一個axis參數,指定軸線的聚合統計。對於二維及以上數組,若不指定axis,即axis=None,此時對數組所有數值求聚合統計

min,argmin,與最大一致

mean、std,分別求均值和標準差,也可接收一個預設參數axis實現特定軸向聚合統計或全局聚合

var、cov,分別求方差和協方差,與均值標準差類似

sort、argsort,分別返回排序後的數組和相應索引,接收一個axis參數,默認為axis=-1,按最後一個軸向,若axis=None表示先展平成一維數組後再排序;另外可設置排序算法,如快排、堆排或歸併等





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


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





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





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

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


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



seed,因為計算機中的隨機數嚴格講都是偽隨機,需要依賴一個隨機數種子來不斷生成新的隨機數,seed可以用於固定這個隨機種子。當指定隨機數種子後,後續的隨機將得到固化





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



由於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)必然是沿著行方向排序,也就是分別對每一列執行排序。


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



可能困擾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入門詳細教程
    >numpy入門詳細教程python數據科學基礎庫主要是三劍客:numpy,pandas以及matplotlib,每個庫都集成了大量的方法接口,配合使用功能強大。平時雖然一直在用,也看過很多教程,但紙上得來終覺淺,還是需要自己系統梳理總結才能印象深刻。本篇先從numpy開始,對numpy常用的方法進行思維導圖式梳理,多數方法僅拉單列表,部分接口輔以解釋說明及代碼案例。最後分享了個人關於axis和廣播機制的理解。
  • 大數據分析Python NumPy庫使用教程
    在處理數據時,有一個功能強大的庫可以極大地提高代碼的效率,尤其是在處理大型數據集時:NumPy。 目前,這是我們數據工程專業課程中的關於算法複雜性的課程。 我將在大數據分析Python NumPy庫使用教程中學到什麼? 大數據分析Python NumPy庫使用教程為數據工程師提供有關NumPy的從零開始的培訓。
  • Python 繪圖庫 Matplotlib 入門教程
    本文是對它的一個入門教程。運行環境由於這是一個Python語言的軟體包,因此需要你的機器上首先安裝好Python語言的環境。關於這一點,請自行在網絡上搜索獲取方法。關於如何安裝Matplotlib請參見這裡:Matplotlib Installing。
  • 懂Excel輕鬆入門Python數據分析包pandas(二十七):IF函數代替者
    此系列文章收錄在:數據大宇宙 > 數據處理 > E-pd轉發本文並私信我"python",即可獲得Python資料以及更多系列文章(持續更新的)經常聽別人說 Python 在數據領域有多厲害,結果學了很長時間,連數據處理都麻煩得要死。
  • Python學習第117課——numpy中dot的運用舉例
    【每天幾分鐘,從零入門python編程的世界!】上節我們學習了最基礎的matrix的運算,可能有小夥伴覺得這都要涉及高等數學知識了,確實如果你想做數據科學、做人工智慧,統計學、概率論等數學知識,尤其是算法是繞不過去的坎,但是不要怕!!!
  • Python入門教程(二):Numpy數組基礎
    Python中的數組操作幾乎等同於Numpy數組操作,今天我們會展示用Numpy數組操作獲取數據或者子數組,對數組進行分裂,變形和連接的例子。import numpy as npnp.random.seed(0)  # 設置隨機種子數,保證程序執行時每次都可以生成同樣的隨機數組x1 = np.random.randint(10, size=6)  # 一維數組x2 = np.random.randint(10, size=(3, 4))  # 二維數組,創建三行四列的數組
  • 入門|數據科學初學者必知的NumPy基礎知識
    本文介紹了一些 NumPy 基礎知識,適合數據科學初學者學習掌握。NumPy(Numerical Python)是 Python 中的一個線性代數庫。對每一個數據科學或機器學習 Python 包而言,這都是一個非常重要的庫,SciPy(Scientific Python)、Mat-plotlib(plotting library)、Scikit-learn 等都在一定程度上依賴 NumPy。對數組執行數學運算和邏輯運算時,NumPy 是非常有用的。在用 Python 對 n 維數組和矩陣進行運算時,NumPy 提供了大量有用特徵。
  • Python入門小迷宮,走完這個迷宮,就能掌握python編程基礎
    這是一個很神奇的迷宮,走完這個迷宮就能掌握python基礎。其實,這是一個用python做的迷宮小遊戲,非常簡單,但對於python初學者來說,還是有一定的挑戰性,但TONOW有源碼和教程,只要跟著python迷宮小遊戲的教程和相應的源碼,不僅很容易就能自己開發出這個遊戲,還能在這個過程中,掌握python編程的基礎哦!
  • Python模塊NumPy,Pandas,matplotlib的中文文檔
    今天比較忙所以不能寫長文了作為一名數據工程師需要熟練掌握python中的這些numpy,matplotlib,pandas,sklearn,seaborn,statsmodel.模塊但是由於這些模塊的文檔都是英文的可能一些英文不好的同學學起來會比較的困難,所以我從網上給大家找到一些中文的文檔
  • 數據分析-numpy庫快速了解
    1.numpy是什麼庫NumPy是一個開源的Python科學計算基礎庫,包含: 一個強大的N維數組對象 ndarray 廣播功能函數 整合C/C++/Fortran代碼的工具 線性代數、傅立葉變換、隨機數生成等功能
  • ...請收下這份2018學習清單:150個最好的機器學習,NLP和Python教程
    一般我會找一個有意思的教程或者視頻,再由此找到三四個,甚至更多的教程或者視頻。猛回頭,發現標收藏夾又多了20個資源待我學習(推薦提升效率工具Tab Bundler)。blogs.nvidia.com/blog/2016/07/29/whats-difference-artificial-intelligence-machine-learning-deep-learning-ai/11、優化算法與降維算法數據降維的七招鍊金術
  • 深度學習入門教程:手把手帶你用Numpy實現卷積神經網絡(一)
    本教程由深度學習中文社區(Studydl.com)持續發布與更新, 教程中完整代碼已上傳至github上, 可關注我百家號後發送消息"CNN代碼", 獲得地址.前言Numpy是一個非常好用的python科學計算的庫,CNN是現在視覺領域深度學習的基礎之一。
  • 乾貨 | 請收下這份2018學習清單:150個最好的機器學習,NLP和Python教程
    一般我會找一個有意思的教程或者視頻,再由此找到三四個,甚至更多的教程或者視頻。猛回頭,發現標收藏夾又多了20個資源待我學習(推薦提升效率工具Tab Bundler)。 Scipy課程筆記(scipy-lectures.org)http://www.scipy-lectures.org/ Python Numpy 教程(Stanford CS231n)http://cs231n.github.io/python-numpy-tutorial/
  • 好程式設計師Python培訓分享numpy簡介
    NumPy數組用於存儲訓練數據和機器學習模型的參數。 圖像處理和計算機圖形學:計算機中的圖像表示為多維數字數組。NumPy成為同樣情況下最自然的選擇。實際上,NumPy提供了一些優秀的庫函數來快速處理圖像。例如,鏡像圖像、按特定角度旋轉圖像等。 數學任務:NumPy對於執行各種數學任務非常有用,如數值積分、微分、內插、外推等。
  • Python的武器庫05:numpy模塊(下)
    說到程式語言python,有一個著名的格言"餘生太短,只用python"。如果要分析為什麼會存在這麼一句格言?python的語法並不簡單,有複雜難懂的部分,之所以有這樣一句格言,是因為python中有很多強大的模塊,就像一個武器庫。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    python教程大合集,包含python所有就業方向,每套課程均來自市面上主流培訓機構的原版教程,價值都在數百元以上 每套課程均包含:視頻課程+課件+原始碼 重要:建議根據自己工作方向和需求,重點選擇2到3套課程學精,吃透,然後在工作 重要:零基礎小白建議先選擇零基礎全能篇的一套課程學精,然後再根據自 己的需求和規劃選擇學習其他方向課程,學完後一定要多實踐
  • 中科大統計學python_python 中科大 - CSDN
    強調在知識的廣度、深度和趣味性之間尋找最佳平衡點,在生動幽默中講述數據挖掘的核心思想、關鍵技術以及一些在其它相關課程和教科書中少有涉及的重要知識點,適合對大數據和數據科學感興趣的各專業學生以及工程技術人員學習。
  • 清晰易懂的Numpy入門教程
    翻譯 | 石頭來源 | Machine Learning PlusNumpy是python語言中最基礎和最強大的科學計算和數據處理的工具包,如數據分析工具pandas也是基於numpy構建的,機器學習包scikit-learn也大量使用了numpy方法。本文介紹了Numpy的n維數組在數據處理和分析的所有核心應用。
  • 如果不懂Numpy,請別說自己是Python程式設計師
    了解 numpy之後,我才想明白當初磁層頂的三維模型之所以慢,是因為使用了 list(python 數組)而不是 ndarray(numpy 數組)存儲數據。有了 numpy,python 程式設計師才有可能寫出媲美 C 語言運行速度的代碼。
  • numpy中的數據類型對象有哪些
    Numpy數據類型numpy是一個python擴展包,它可以為我們提供更精確的科學技術,更強大的數學能力。為此,numpy定義了比python更豐富的數據類型來達成目的。數據類型以上就是一系列Numpy中提供的數據類型。需要理解的是,Numpy中的數據類型,和python本身的數據類型是不同的。Numpy中的數據類型,實質是數據類型對象dtype的實例。