圖解 NumPy,從功能到方法都如此簡單!

2021-01-14 CPDA數據說

      在Python數據分析領域,NumPy 這個庫是少不了的,可是對於一些矩陣的操作,理解起來太抽象了。最近看到一篇文章,它以可視化的形式呈現了 NumPy中矩陣操作的一些原理,推薦給大家一看。

本文用可視化的方式介紹了 NumPy 的功能和使用示例。


      NumPy 軟體包是 Python 生態系統中數據分析、機器學習和科學計算的主力軍。它極大地簡化了向量和矩陣的操作處理。Python 的一些主要軟體包(如 scikit-learn、SciPy、pandas 和 tensorflow)都以 NumPy 作為其架構的基礎部分。除了能對數值數據進行切片(slice)和切塊(dice)之外,使用 NumPy 還能為處理和調試上述庫中的高級實例帶來極大便利。


      本文將介紹使用 NumPy 的一些主要方法,以及在將數據送入機器學習模型之前,它如何表示不同類型的數據(表格、圖像、文本等)。


import numpy as np


創建數組


    我們可以通過傳遞一個 python 列表並使用 np.array()來創建 NumPy 數組(極大可能是多維數組)。在本例中,python 創建的數組如下圖右所示:



      通常我們希望 NumPy 能初始化數組的值,為此 NumPy 提供了 ones()、zeros() 和 random.random() 等方法。我們只需傳遞希望 NumPy 生成的元素數量即可:



      一旦創建了數組,我們就可以盡情對它們進行操作。


數組運算


      讓我們創建兩個 NumPy 數組來展示數組運算功能。我們將下圖兩個數組稱為 data 和 ones:



      將它們按位置相加(即每行對應相加),直接輸入 data + ones 即可:



      當我開始學習這些工具時,我發現這樣的抽象讓我不必在循環中編寫類似計算。此類抽象可以使我在更高層面上思考問題。


      除了「加」,我們還可以進行如下操作:



      通常情況下,我們希望數組和單個數字之間也可以進行運算操作(即向量和標量之間的運算)。比如說,我們的數組表示以英裡為單位的距離,我們希望將其單位轉換為千米。只需輸入 data * 1.6 即可:



      看到 NumPy 是如何理解這個運算的了嗎?這個概念叫做廣播機制(broadcasting),它非常有用。


索引


      我們可以我們像對 python 列表進行切片一樣,對 NumPy 數組進行任意的索引和切片:



聚合


      NumPy 還提供聚合功能:



      除了 min、max 和 sum 之外,你還可以使用 mean 得到平均值,使用 prod 得到所有元素的乘積,使用 std 得到標準差等等。


更多維度


      上述的例子都在一個維度上處理向量。NumPy 之美關鍵在於,它能夠將上述所有方法應用到任意數量的維度。


創建矩陣


      我們可以傳遞下列形狀的 python 列表,使 NumPy 創建一個矩陣來表示它:


np.array([[1,2],[3,4]])


      我們也可以使用上面提到的方法(ones()、zeros() 和 random.random()),只要寫入一個描述我們創建的矩陣維數的元組即可:



矩陣運算


        如果兩個矩陣大小相同,我們可以使用算術運算符(+-*/)對矩陣進行加和乘。NumPy 將它們視為 position-wise 運算:



      我們也可以對不同大小的兩個矩陣執行此類算術運算,但前提是某一個維度為 1(如矩陣只有一列或一行),在這種情況下,NumPy 使用廣播規則執行算術運算:


點乘


      算術運算和矩陣運算的一個關鍵區別是矩陣乘法使用點乘。NumPy 為每個矩陣賦予 dot() 方法,我們可以用它與其他矩陣執行點乘操作:



      我在上圖的右下角添加了矩陣維數,來強調這兩個矩陣的臨近邊必須有相同的維數。你可以把上述運算視為:



矩陣索引


      當我們處理矩陣時,索引和切片操作變得更加有用:



矩陣聚合


      我們可以像聚合向量一樣聚合矩陣:



      我們不僅可以聚合矩陣中的所有值,還可以使用 axis 參數執行跨行或跨列聚合:



轉置和重塑


      處理矩陣時的一個常見需求是旋轉矩陣。當需要對兩個矩陣執行點乘運算並對齊它們共享的維度時,通常需要進行轉置。NumPy 數組有一個方便的方法 T 來求得矩陣轉置:



      在更高級的實例中,你可能需要變換特定矩陣的維度。在機器學習應用中,經常會這樣:某個模型對輸入形狀的要求與你的數據集不同。在這些情況下,NumPy 的 reshape() 方法就可以發揮作用了。只需將矩陣所需的新維度賦值給它即可。可以為維度賦值-1,NumPy 可以根據你的矩陣推斷出正確的維度:



再多維度


      NumPy 可以在任意維度實現上述提到的所有內容。其中心數據結構被叫作 ndarray(N 維數組)不是沒道理的。



      在很多情況下,處理一個新的維度只需在 NumPy 函數的參數中添加一個逗號:



      實際用法


      以下是 NumPy 可實現的有用功能的實例演示。


      公式


      實現可用於矩陣和向量的數學公式是 NumPy 的關鍵用例。這就是 NumPy 是 python 社區寵兒的原因。例如均方差公式,它是監督機器學習模型處理回歸問題的核心:



      在 NumPy 中實現該公式很容易:



      這樣做的好處在於,NumPy 並不關心 predictions 和 labels 包含一個值還是一千個值(只要它們大小相同)。我們可以通過一個示例依次執行上面代碼行中的四個操作:



      預測和標籤向量都包含三個值,也就是說 n 的值為 3。減法後,得到的值如下:



      然後將向量平方得到:



      現在對這些值求和:



      得到的結果即為該預測的誤差值和模型質量評分。


      數據表示


      考慮所有需要處理和構建模型所需的數據類型(電子表格、圖像、音頻等),其中很多都適合在 n 維數組中表示:


      表格和電子表格


      電子表格或值表是二維矩陣。電子表格中的每個工作表都可以是它自己的變量。python 中最流行的抽象是 pandas 數據幀,它實際上使用了 NumPy 並在其之上構建。



      音頻和時間序列


      音頻文件是樣本的一維數組。每個樣本都是一個數字,代表音頻信號的一小部分。CD 質量的音頻每秒包含 44,100 個樣本,每個樣本是-65535 到 65536 之間的整數。這意味著如果你有一個 10 秒的 CD 質量 WAVE 文件,你可以將它加載到長度為 10 * 44,100 = 441,000 的 NumPy 數組中。如果想要提取音頻的第一秒,只需將文件加載到 audio 的 NumPy 數組中,然後獲取 audio[:44100]。


      以下是一段音頻文件:



      時間序列數據也是如此(如股票價格隨時間變化)。


      圖像


      圖像是尺寸(高度 x 寬度)的像素矩陣。


      如果圖像是黑白(即灰度)的,則每個像素都可以用單個數字表示(通常在 0(黑色)和 255(白色)之間)。想要裁剪圖像左上角 10 x 10 的像素嗎?在 NumPy 寫入

即可。


      下圖是一個圖像文件的片段:



      如果圖像是彩色的,則每個像素由三個數字表示——紅色、綠色和藍色。在這種情況下,我們需要一個三維數組(因為每個單元格只能包含一個數字)。因此彩色圖像由尺寸為(高 x 寬 x3)的 ndarray 表示:



      語言


      如果我們處理文本,情況就不同了。文本的數字表示需要一個構建詞彙表的步驟(模型知道的唯一字清單)和嵌入步驟。讓我們看看用數字表示以下文字的步驟:


      模型需要先查看大量文本,再用數字表示這位詩人的話語。我們可以讓它處理一個小數據集,並用它來構建一個詞彙表(71,290 個單詞):



      這個句子可以被分成一個 token 數組(基於通用規則的單詞或單詞的一部分):



      然後我們用詞彙表中的 ID 替換每個單詞:



      這些 ID 仍然沒有為模型提供太多信息價值。因此,在將這一組單詞輸入到模型之前,我們需要用嵌入替換 token/單詞(在本例中為 50 維 word2vec 嵌入):



  可以看到,該 NumPy 數組的維度為 [embedding_dimension x sequence_length]。出於性能原因,深度學習模型傾向於保留比大小的第一維(因為如果並行訓練多個示例,模型訓練速度會加快)。在這種情況下,reshape() 變得非常有用。如像 BERT 這樣的模型期望的輸入形式是:[batch_size,sequence_length,embedding_size]。



      現在這是 numeric volume 形式,模型可以處理並執行相應操作。其他行雖然留空,但是它們會被填充其他示例以供模型訓練(或預測)。

相關焦點

  • Numpy入門詳細教程
    >numpy入門詳細教程python數據科學基礎庫主要是三劍客:numpy,pandas以及matplotlib,每個庫都集成了大量的方法接口,配合使用功能強大。本篇先從numpy開始,對numpy常用的方法進行思維導圖式梳理,多數方法僅拉單列表,部分接口輔以解釋說明及代碼案例。最後分享了個人關於axis和廣播機制的理解。
  • 圖解NumPy:常用函數的內在機制
    所有包含花式索引的方法都是可變的:它們允許通過分配來修改原始數組的內容,如上所示。這一功能可通過將數組切分成不同部分來避免總是複製數組的習慣。其兩個常用功能都有各自的專用函數:過度重載的 np.where 函數和 np.clip 函數。它們的含義如下:向量運算NumPy 在速度上很出彩的一大應用領域是算術運算。向量運算符會被轉換到 C++ 層面上執行,從而避免緩慢的 Python 循環的成本。NumPy 支持像操作普通的數那樣操作整個數組。
  • python數據科學系列:numpy入門詳細教程
    numpy,pandas以及matplotlib,每個庫都集成了大量的方法接口,配合使用功能強大。Random是numpy下的一個子包,內置了大量的隨機數方法接口,包括絕大部分概率分布接口,常用的主要還是均勻分布和正態分布:均勻分布:random、rand、uniform,三者功能具有相似性
  • 數據分析-numpy庫快速了解
    1.numpy是什麼庫NumPy是一個開源的Python科學計算基礎庫,包含: 一個強大的N維數組對象 ndarray 廣播功能函數 整合C/C++/Fortran代碼的工具 線性代數、傅立葉變換、隨機數生成等功能
  • 一鍵獲取新技能,玩轉NumPy數據操作
    除了數據切片和數據切塊的功能之外,掌握numpy也使得開發者在使用各數據處理庫調試和處理複雜用例時更具優勢。在本文中,將介紹NumPy的主要用法,以及它如何呈現不同類型的數據(表格,圖像,文本等),這些經Numpy處理後的數據將成為機器學習模型的輸入。
  • Numpy基礎,一位Python大神的筆記,看了後我連Matlab都學會了!
    創建矩陣對於Python中的numpy模塊,一般用其提供的ndarray對象。 創建一個ndarray對象很簡單,只要將一個list作為參數即可。例如:Stacking together different arrays矩陣的合併可以通過numpy中的hstack方法和vstack方法實現:
  • Numpy學習打卡task01
    在Python中使用NumPy可以得到與MATLAB相當的功能,因為它們都是解釋型的,而且只要大部分操作是在數組或矩陣上進行的,而不是在標量上進行的,它們都允許用戶編寫快速的程序。相比之下,MATLAB擁有大量的附加工具箱,尤其是Simulink,而NumPy則與Python內在地集成在一起,Python是一種更現代、更完整的程式語言。
  • Numpy筆記註解,看完我連Matlab都學會了!
    創建矩陣對於Python中的numpy模塊,一般用其提供的ndarray對象。 創建一個ndarray對象很簡單,只要將一個list作為參數即可。Stacking together different arrays矩陣的合併可以通過numpy中的hstack方法和vstack方法實現:
  • Python數據分析之numpy數組全解析
    在NumPy 中,最重要的對象是稱為 ndarray 的N維數組類型,它是描述相同類型的元素集合,numpy所有功能幾乎都以ndarray為核心展開。ndarray 中的每個元素都是數據類型對象(dtype)的對象。
  • 8 種進行簡單線性回歸的方法分析與討論
    除此之外,我們還可以使用該庫的 pipeline 與 FeatureUnion 功能(如:數據歸一化、模型回歸係數正則化、將線性模型傳遞給下遊模型),但是一般來看,如果一個數據分析師僅需要一個又快又簡單的方法來確定回歸係數(或是一些相關的統計學基本結果),那麼這並不是最快或最簡潔的方法。 雖然還存在其他更快更簡潔的方法,但是它們都不能提供同樣的信息量與模型靈活性。
  • Numpy應用整理
    現在幾乎各種應用場合都會用到numpy,主要有以下幾個原因:numpy提供了很多數值計算和常用算法的函數numpy歸功了很多線性代數的相關操作numpy的執行效率高首先導入numpy庫import numpy as np常規列表應用用numpy建的列表類型都是ndarray,因此我們首先來看np.array
  • D03 Numpy排序、篩選、統計
    在生活中最為常見的數據存放形式是二維表,我們將二維表數據轉換為ndarray之後對應的即為二維數組,下面以二維數組為例,講述numpy的排序、篩選、統計。排序關於排序,numpy的開發者們一早就為我們準備好了方法函數供我們使用,並且提供了多種不同的排序算法例如最常用的quicksort以及穩定性最強的mergesort。
  • Numpy學習打卡task02
    本文中的numpy.random就是偽隨機數生成器。對隨機性的各種應用導致了幾種不同的隨機數據生成方法的發展,其中有些方法自古以來就存在,在其行列中,有眾所周知的 "經典 "例子,包括擲骰子、擲硬幣、撲克牌的洗牌、《易經》中木籤的使用(用於佔卜),以及其他無數的技術。
  • 手把手教你學Numpy——常用API合集
    基本統計方法在日常的工作當中,我們經常需要通過一系列值來了解特徵的分布情況。比較常用的有均值、方差、標準差、百分位數等等。前面幾個都比較好理解,簡單介紹一下這個百分位數,它是指將元素從小到大排列之後,排在第x%位上的值。我們一般常用的是25%,50%和75%這三個值,通過這幾個值,我們很容易對於整個特徵的分布有一個大概的了解。
  • 學習筆記,從NumPy到Scrapy,學習Python不能錯過這些庫
    所以我到網絡上搜集補充關於這些庫的說明內容,感覺在這個整理資料的過程中,對於這些python程序庫了解了更多,以下是我整理的學習筆記。一、核心庫與統計1.NumPynumpy(Numerical Python extensions)是一個第三方的Python包,用於科學計算。其前身是1995年就開始開發的一個用於數組運算的庫。
  • 簡約而不簡單|值得收藏的Numpy小抄表(含主要語法、代碼)
    安裝Numpy可以通過 Pip 或者 Anaconda安裝Numpy:或本文目錄基礎NumPy最常用的功能之一就是NumPy數組:列表和NumPy數組的最主要區別在於功能性和速度。2, 1])y.sort()print(y)>>> [ 1 2 3 4 5 6 7 8 9 10]數組操作例程增加或減少元素操作描述文檔np.append(a,b)增加數據項到數組https://docs.scipy.org/doc/numpy/reference/generated/numpy.append.htmlnp.insert(array,
  • 簡約而不簡單!值得收藏的 NumPy 小抄表(含主要語法、代碼)
    可以通過 Pip 或者 Anaconda安裝Numpy:或   本文目錄   基礎NumPy最常用的功能之一就是Sort sorts in ascending ordery = np.array([10, 9, 8, 7, 6, 5, 4, 3, 2, 1])y.sort()print(y)>>> [ 1 2 3 4 5 6 7 8 9 10]數組操作例程增加或減少元素操作描述文檔np.append(a,b)增加數據項到數組
  • Python中的Numpy基礎20問
    例如,x2.reshape(1,2,3)是將二維數組轉換成三維數組,參數個數代表要轉換的維度,參數數字從左到右分別表示0軸、1軸、2軸的元素數量。resize方法和reshape方法使用形式一樣,區別是resize方法改變了原始數組形狀。
  • 圖解NumPy,這是理解數組最形象的一份教程了
    本文將介紹使用 NumPy 的一些主要方法,以及在將數據送入機器學習模型之前,它如何表示不同類型的數據(表格、圖像、文本等)。import numpy as np創建數組我們可以通過傳遞一個 python 列表並使用 np.array()來創建 NumPy 數組(極大可能是多維數組)。
  • NumPy ndarray數組的創建
    下面將介紹Numpy的一些常用方法,尤其是與機器學習、深度學習相關的一些內容。NumPy 封裝了一個新的數據類型 ndarray(N-dimensional Array),它是一個多維數組對象。該對象封裝了許多常用的數學運算函數,方便我們做數據處理、數據分析等。那麼,如何生成 ndarray 呢?