熟悉數(shù)據(jù)科學的人都很喜歡NumPy庫,它是時下最流行的Python系數(shù)據(jù)科學的中流砥柱,是Python科學計算讲逛、數(shù)據(jù)分析以及AI 機器學習的基礎組件。在最流行的三大數(shù)據(jù)處理棧R岭埠、Matlab和Python中盏混,NumPy是最重要的組件之一,有很多Python系的數(shù)據(jù)處理系統(tǒng)都依賴NumPy作為其基礎架構的基礎部分惜论,比如tensorflow许赃、pandas、SciPy和scikit-learn等馆类。
NumPy極大地簡化了向量和矩陣的操作和處理混聊。本文中蟲蟲將一圖像可視化方式介紹NumPy的主要方法,以及在ML數(shù)據(jù)模型中的數(shù)據(jù)表示乾巧,圖文并茂的方式系統(tǒng)對大家的學習有所幫助句喜。
數(shù)組
創(chuàng)建數(shù)組
數(shù)組的創(chuàng)建通常是通過使用np.array()
,并將列表傳遞給它沟于。如下圖:
在創(chuàng)建時候NumPy也提供了很多方法幫我們初始化數(shù)組咳胃,這些方法包括:ones(),zeros()和random.random()旷太。其參數(shù)為要生成的元素個數(shù):
數(shù)組計算
做為例子我們首先創(chuàng)建兩個數(shù)組data和one:
最其做加法運算展懈,其實很簡單就是對應位置元素互相想加。
NumPy在處理這些計算時候供璧,簡單就想正常數(shù)學計算一樣标沪,不像其他語言中那樣復雜的處理方式(比如做計算符號重載)。從而可以讓我們專注于數(shù)學計算而不是怎么用循環(huán)表示嗜傅。更多計算:
實際中金句,也有數(shù)組和單個數(shù)字之間執(zhí)行計算(也稱為向量和標量之間的計算)。比如吕嘀,我們的數(shù)組表示以英里為單位的距離违寞,我們希望將其轉換為公里數(shù)贞瞒。我們可以簡單使用data *1.6:
NumPy對每個元素都會做了乘法計算。這個又叫做廣播趁曼,一個非常有用的概念军浆。
索引
我們可以通過各種方式列表切片方式來表示NumPy數(shù)組部分和對其索引:
聚合計算
NumPy也支持各種聚合函數(shù):
除了最小值,最大值和總和之外挡闰,還支持很多其他統(tǒng)計函數(shù)你乒融,比如平均值mean,所有元素相乘的累乘prod摄悯,標準差std赞季,及其他。
多維度
截止當前奢驯,我們所有例子都是在一個維度上處理向量申钩。 NumPy強大之處的關鍵是它能夠將所有方法都應用到任意數(shù)量的維度。
創(chuàng)建矩陣
我們可以給array函數(shù)傳遞如下python列表參數(shù)瘪阁,NumPy就會創(chuàng)建一個矩陣:
np.array([[1,2],[3,4]])
也可以使用上面提到的相同方法(ones()撒遣,zeros()和random.random()),只要我們給它們一個元組來表示正在創(chuàng)建的矩陣的維度:
矩陣計算
如果兩個矩陣的大小相同管跺,我們可以使用算術運算符(+ - * /)來對矩陣計算义黎。 NumPy將這些作為位置操作處理:
只有當不同維度為1時(例如矩陣只有一列或一行),我們才能在不同大小的矩陣上進行這些算術運算豁跑,在這種情況下廉涕,NumPy將其廣播規(guī)則用于該操作:
點計算
與算術相關的一個關鍵區(qū)別是使用點積的矩陣乘法。 NumPy為每個矩陣提供了一個dot()方法贩绕,我們可以用它來執(zhí)行與其他矩陣的點積運算:
這個圖的底部添加了矩陣尺寸火的,以強調兩個矩陣在它們彼此面對的一側必須具有相同的尺寸∈缜悖可以將此操作可視化為如下所示:
矩陣索引
當我們操作矩陣時馏鹤,索引和切片操作會變得更加有用:
矩陣聚合
我們可以像聚合數(shù)組一樣聚合矩陣:
我們不僅可以聚合矩陣中的所有值,還可以使用axis參數(shù)對行或列進行聚合:
轉置和重塑
處理矩陣時的一個共同需求是需要旋轉矩陣娇哆。當我們需要采用兩個矩陣的點積并??需要對齊它們共享的維度時湃累,通常就是這種情況。 NumPy數(shù)組有一個方便的屬性叫做T來獲得矩陣的轉置:
在更高級的用例中碍讨,可能需要切換某個矩陣的維度治力。在機器學習應用程序中通常會有這種情況,其中某個模型期望輸入的某個維度與數(shù)據(jù)集不同勃黍。在這些情況下宵统,NumPy的reshape()方法很有用。只需將矩陣所需的新尺寸傳遞給它即可,可以為維度傳遞-1覆获,NumPy可以根據(jù)已有矩陣推斷出正確的維度:
更多維度
NumPy可以完成我們在任何維度上提到的所有內容马澈。其中心數(shù)據(jù)結構稱為ndarray(N維數(shù)組)瓢省。
在很多時候,處理新維度只是在NumPy函數(shù)的參數(shù)中添加逗號:
實際用法——數(shù)據(jù)表示方法
最后來干貨痊班,我們來舉一些NumPy能幫助你完成的有用示例包括公式和數(shù)據(jù)表示:
公式
實現(xiàn)適用于矩陣和向量的數(shù)學公式是考慮NumPy的關鍵用例勤婚。這就是NumPy是科學Python社區(qū)的寵兒主要原因。例如涤伐,考慮平均誤差公式馒胆,它是監(jiān)督機器學習模型處理回歸問題的核心:
在NumPy中實現(xiàn)它是輕而易舉的:
這樣做的好處是,numpy并不會關心預測和標簽是否包含一個或一千個值(只要它們的大小相同)凝果∽S兀可以通過一個示例逐步執(zhí)行該代碼行中的四個操作:
預測和標簽向量都包含三個值。這意味著n的值為3豆村。執(zhí)行減法后液兽,最終得到如下值:
然后就可以對矢量中的值進行平方
最后:
數(shù)據(jù)表示
試想我們需要緊縮和構建模型所需的所有數(shù)據(jù)類型(電子表格骂删,圖像掌动,音頻......等)。其中很多都非常適合在n維數(shù)組中表示:
表格和電子表格
電子表格或值表是二維矩陣宁玫。電子表格中的每個工作表都可以是自己的變量粗恢。 Python中最受歡迎的抽象是pandas數(shù)據(jù)幀,它實際上使用NumPy并在其上構建欧瘪。
音頻和時間序列
音頻文件是一維樣本數(shù)組眷射。每個樣本都是一個代表音頻信號的一小部分的數(shù)字。 CD質量的音頻每秒可能有44,100個樣本佛掖,每個樣本是-65535到65536之間的整數(shù)妖碉。這意味著如果你有一個10秒的CD質量的WAVE文件,你可以將它加載到長度為10 * 44,100的NumPy數(shù)組中= 441,000個樣本芥被。想要提取音頻的第一秒欧宜?只需將文件加載到音頻的NumPy數(shù)組中,然后獲取音頻[:44100]拴魄。
以下是一段音頻文件:
時間序列數(shù)據(jù)也是如此(例如冗茸,股票價格隨時間變化)。
圖片
圖像是大衅ブ小(高x寬)像素的矩陣夏漱。
如果圖像是黑白的(a.k.a.灰度),則每個像素可以用單個數(shù)字表示(通常在0(黑色)和255(白色)之間)顶捷。想要裁剪圖像的左上角10 x 10像素部分挂绰?告訴NumPy通過image[:10,:10]。
下面一個圖像文件的片段:
如果圖像是彩色的服赎,則每個像素由三個數(shù)字表示:紅色葵蒂,綠色和藍色各自的值芳室。在這種情況下,我們需要第三維(因為每個單元格只能包含一個數(shù)字)刹勃。因此彩色圖像由尺寸的ndarray表示:(高x寬x 3)堪侯。
自然語言
如果我們處理文本,數(shù)據(jù)就會有所不同荔仁。文本的數(shù)字表示需要一個構建詞匯表的步驟(模型知道的所有唯一單詞的清單)和嵌入步驟伍宦。讓我們看看用古代用數(shù)字表示這個引用的步驟:
我們可以繼續(xù)處理一個小數(shù)據(jù)集并使用它來構建一個詞匯表(71,290個單詞):
然后可以將句子分成一系列標記(基于通用規(guī)則的單詞或單詞部分):
然后我們用詞匯表中的id替換每個單詞:
這些ID仍然不能為模型提供太多信息價值。因此乏梁,在將一系列單詞提供給模型之前次洼,需要使用嵌入來替換標記/單詞(比如:50維word2vec嵌入):
以看到此NumPy數(shù)組的維度為[embedding_dimension x sequence_length]。在實踐中遇骑,這些將是另一種方式卖毁,但我以這種方式呈現(xiàn)它的視覺一致性。出于性能原因落萎,深度學習模型傾向于保留批量大小的第一維(因為如果并行訓練多個示例亥啦,則可以更快地訓練模型)。這是一個明顯的情況练链,reshape()變得非常有用翔脱。例如,像BERT這樣的模型會期望其輸入形狀為:[batch_size媒鼓,sequence_length届吁,embedding_size]。
現(xiàn)在這是一個數(shù)字卷绿鸣,模型可以處理并執(zhí)行有用的操作疚沐。其他行被留空了,但是他們會填充其他示例以供模型訓練(或預測)潮模。
轉載
https://www.toutiao.com/a6707983457248608771/
感謝原創(chuàng) 蟲蟲安全 2019-06-30 00:01:46