精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

圖解NumPy的核心概念:向量、矩陣、3維及更高維數組

工程師鄧生 ? 來源:雷鋒網 ? 作者:雷鋒網 ? 2021-02-11 10:01 ? 次閱讀

譯者:AI研習社(季一帆)

雙語原文鏈接:NumPy Illustrated: The Visual Guide to NumPy

5e3eb1852ebe4f8896513e83f6b10f1b.jpeg

是一個廣泛適用的Python數據處理庫,, 等庫都基于numpy。同時,在、、等深度許欸小框架中,了解numpy將顯著提高數據共享和處理能力,甚至無需過多更改就可以在運行計算。

n維數組是NumPy的核心概念,這樣的好處,盡管一維和而為數組的處理方式有些差異,但多數不同維數組的操作是一樣的。本文將對以下三個部分展開介紹:

向量——一維數組

矩陣——二維數組

3維及更高維數組

本文受JayAlammar的文章“ A Visual Intro to NumPy”的啟發,并對其做了更詳細豐富的介紹。

numpy數組 vs. Python列表

乍看上去,NumPy數組與Python列表極其相似。它們都用來裝載數據,都能夠快速添加或獲取元素,插入和移除元素則比較慢。

當然相比python列表,numpy數組可以直接進行算術運算:

6bab501daab64bbc98a393d6f4c8fa6b.jpeg

除此之外,numpy數組還具有以下特點:

更緊湊,高維時尤為明顯

向量化后運算速度比列表更快

在末尾添加元素時不如列表高效

元素類型一般比較固定

b7ea2f59f44a47099847d2b512359db7.jpeg

其中,O(N)表示完成操作所需的時間與數組大小成正比(請見),O(1)表示操作時間與數組大小無關(詳見)。

1.向量與1維數組向量初始化

通過Python列表可以創建NumPy數組,如下將列表元素轉化為一維數組:

dc9b244ada594bf7afecc7238940d186.jpeg

注意,確保列表元素類型相同,否則dtype=’object‘,將影響運算甚至產生語法錯誤。

由于在數組末尾沒有預留空間以快速添加新元素,NumPy數組無法像Python列表那樣增長,因此,通常的做法是在變長Python列表中準備好數據,然后將其轉換為NumPy數組,或是使用np.zeros或np.empty預先分配必要的空間:

f7cdf51b970247718c441d0e9310f9c2.jpeg

通過以下方法可以創建一個與某一變量形狀一致的空數組:

c0c89a9b84794e9491d129d13c156039.jpeg

不止是空數組,通過上述方法還可以將數組填充為特定值:

001808537eca41a4a2af9ff83e3f30e8.jpeg

在NumPy中,還可以通過單調序列初始化數組:

bf9a223f4b4a4aa7b0f980ffa7ab092d.jpeg

如果您需要[0., 1., 2.]這樣的浮點數組,可以更改arange輸出的類型,即arange(3).astype(float),但有更好的方法:由于arange函數對類型敏感,因此參數為整數類型,它生成的也是整數類型,如果輸入float類型arange(3.),則會生成浮點數。

arange浮點類型數據不是非常友好:

5cb2093c5b99460dabe8a03f68618829.jpeg

上圖中,0.1對我們來說是一個有限的十進制數,但對計算機而言,它是一個二進制無窮小數,必須四舍五入為一個近似值。因此,將小數作為arange的步長可能導致一些錯誤。可以通過以下兩種方式避免如上錯誤:一是使間隔末尾落入非整數步數,但這會降低可讀性和可維護性;二是使用linspace,這樣可以避免四舍五入的錯誤影響,并始終生成要求數量的元素。但使用linspace時尤其需要注意最后一個的數量參數設置,由于它計算點數量,而不是間隔數量,因此上圖中數量參數是11,而不是10。

隨機數組的生成如下:

f12e0a428d824c06ac7f11ad18fb1090.jpeg

向量索引

對于數組數據的訪問,numpy提供了便捷的訪問方式:

55c817393ea74415a101d0507789e7e7.jpeg

上圖中,除“fancy indexing”外,其他所有索引方法本質上都是`views`:它們并不存儲數據,如果原數組在被索引后發生更改,則會反映出原始數組中的更改。

上述所有這些方法都可以改變原始數組,即允許通過分配新值改變原數組的內容。這導致無法通過切片來復制數組:

a43887f2df8d40b89e0adeb8d0eff42b.jpeg

此外,還可以通過布爾索引從NumPy數組中獲取數據,這意味著可以使用各種邏輯運算符:

adb4717f945b4618ad2cd813bc6b7004.jpeg

和與其他Python使用類似

注意,不可以使用`3 《= a 《= 5`這樣的Python“三元”比較。

如上所述,布爾索引是可寫的。如下圖np.where和np.clip兩個專有函數。

ce46e1b50c3944f5b1c3b05ea46cfc41.jpeg

向量操作

NumPy的計算速度是其亮點之一,其向量運算操作接近C++級別,避免了Python循環耗時較多的問題。NumPy允許像普通數字一樣操作整個數組:

55dd6cea4c744c06b731a070a0e914e3.jpeg

在python中,a//b表示a div b(除法的商),x**n表示 x?

浮點數的計算也是如此,numpy能夠將標量廣播到數組:

7fc3ca053bef4f6fb6dfcf2498869037.jpeg

numpy提供了許多數學函數來處理矢量:

db831a4264c24a48b21aace75cd874eb.jpeg

向量點乘(內積)和叉乘(外積、向量積)如下:

9ac365a5f80c4fecb7c76eb4b9943e2d.jpeg

numpy也提供了如下三角函數運算:

b971226ee7874491b30348f10d5d145d.jpeg

數組整體進行四舍五入:

407cecd9079c428aa27e950f8acb2a5f.jpeg

floor向上取整,ceil向下取整,round四舍五入

np.around與np.round是等效的,這樣做只是為了避免 from numpy import *時與Python aroun的沖突(但一般的使用方式是import numpy as np)。當然,你也可以使用a.round。

numpy還可以實現以下功能:

62d5c052587445c79cb97f76aaebe745.jpeg

以上功能都存在相應的nan-resistant變體:例如,等

在numpy中,排序函數功能有所閹割:

5b18a52c95844b3da6f4f30d9ebccecf.jpeg

對于一維數組,可以通過反轉結果來解決reversed函數缺失的不足,但在2維數組中該問題變得棘手。

查找向量中的元素

不同于Python列表,NumPy數組沒有索引方法。

89c5ecbf37ff40b29cd13758a1d2c6e0.jpeg

index中的方括號表示j或i&j可以省略

可以通過np.where(a==x)[0] [0]查找元素,但這種方法很不pythonic,哪怕需要查找的項在數組開頭,該方法也需要遍歷整個數組。

使用Numba實現加速查找,next((i[0] for i, v in np.ndenumerate(a) if v==x), -1),在最壞的情況下,它的速度要比where慢。

如果數組是排好序的,使用v = np.(a, x); return v if a[v]==x else -1時間復雜度為O(log N),但在這之前,排序的時間復雜度為O(N log N)。

實際上,通過C實現加速搜索并不是困難,問題是浮點數據比較。

浮點數比較

np.allclose(a, b)用于容忍誤差之內的浮點數比較。

cfea76a84a8f4ec28b1af151659454a4.jpeg

np.allclose假定所有比較數字的尺度為1。如果在納秒級別上,則需要將默認atol參數除以1e9:np.allclose(1e-9,2e-9, atol=1e-17)==False。

math.isclose不對要比較的數字做任何假設,而是需要用戶提供一個合理的abs_tol值(np.allclose默認的atol值1e-8足以滿足小數位數為1的浮點數比較,即math.isclose(0.1+0.2–0.3, abs_tol=1e-8)==True。

此外,對于絕隊偏差和相對偏差,np.allclose依然存在一些問題。例如,對于某些值a、b, allclose(a,b)!=allclose(b,a),而在math.isclose中則不存在這些問題。查看GitHub上的和相應的了解更多信息

2.矩陣和二維數組

過去,NumPy中曾有一個專用的matrix類,但現在已被棄用,因此在下文中矩陣和2維數組表示同一含義。

矩陣的初始化語法與向量類似:

1b2942500b9e48478d6e3d295dba2e53.jpeg

如上要使用雙括號,因為第二個位置參數(可選)是為dtype(也接受整數)保留的。

隨機矩陣的生成也與向量類似:

408dc34948054eb29accc9a1269ab1df.jpeg

二維數組的索引語法要比嵌套列表更方便:

7a8f3e2a75604eca868718d305a4e505.jpeg

“view”表示數組切片時并未進行任何復制,在修改數組后,相應更改也將反映在切片中。

軸參數

在求和等操作中,NumPy可以實現跨行或跨列的操作。為了適用任意維數的數組,NumPy引入了axis的概念。axis參數的值實際上就是維度數量,如第一個維是axis=0 ,第二維是axis=1,依此類推。因此,在2維數組中,axis=0指列方向,axis=1指行方向。

806a257d60dc44b1a49bc0aa99bdf682.jpeg

矩陣運算

除了+,-,*,/,//和**等數組元素的運算符外,numpy提供了@運算符計算矩陣乘積:

317718f1057f4fcf824169355346dbca.jpeg

類似前文介紹的標量廣播機制,numpy同樣可以通過廣播機制實現向量與矩陣,或兩個向量之間的混合運算:

e20f0237cd0b43fba7fd9012cc72ae7c.jpeg

注意,上圖最后一個示例是對稱的逐元素乘法。使用矩陣乘法@可以計算非對稱線性代數外積,兩個矩陣互換位置后計算內積:

3040384924e54b999052cec066e77476.jpeg

行向量與列向量

根據前文可知,在2維數組中,行向量和列向量被區別對待。通常NumPy會盡可能使用單一類型的1維數組(例如,2維數組a的第j列a[:, j]是1維數組)。默認情況下,一維數組在2維操作中被視為行向量,因此,將矩陣乘行向量時,使用形狀(n,)或(1,n)的向量結果一致。有多種方法可以從一維數組中得到列向量,但并不包括transpose:

e40e9135db5a496182fc5d9e7970151c.jpeg

使用newaxis更新數組形狀和索引可以將1維數組轉化為2維列向量:

a93ac5f7dac44db398573df176c6c215.jpeg

其中,-1表示在reshape是該維度自動決定,方括號中的None等同于np.newaxis,表示在指定位置添加一個空軸。

因此,NumPy中共有三種類型的向量:1維數組,2維行向量和2維列向量。以下是兩兩類型轉換圖:

1837ee6ec2f944a891a85fc34728f141.jpeg

根據廣播規則,一維數組被隱式解釋為二維行向量,因此通常不必在這兩個數組之間進行轉換,對應圖中陰影化區域。

嚴格來說,除一維外的所有數組的大小都是一個向量(如a.shape == [1,1,1,5,1,1]),因此numpy的輸入類型是任意的,但上述三種最為常用。可以使用np.reshape將一維矢量轉換為這種形式,使用np.squeeze可將其恢復。這兩個功能都通過view發揮作用。

矩陣操作

矩陣的拼接有以下兩種方式:

66786c9697de447d8d6621e4c81760d2.jpeg

圖示操作僅適用于矩陣堆疊或向量堆疊,而一維數組和矩陣的混合堆疊只有通過才可實現,會導致維度不匹配錯誤。因為前文提到將一維數組作為行向量,而不是列向量。為此,可以將其轉換為行向量,或使用專門的函數執行此操作:

bcebb74b8c434b828dee0f8d85af40b3.jpeg

與stack對應的是split:

e56ea1e50f6a492f891fca86da073b42.jpeg

矩陣復制有兩種方式:類似粘貼復制;相當于分頁打印。

49e0f64a8b214603bc07802423b35cb6.jpeg

delete可以刪除特定的行或列:

76ae91b20d8448b5be83b1cf24003ea1.jpeg

相應插入操作為insert:

7ab3156913574bbe8c058b6cd971e58e.jpeg

與hstack一樣,append函數無法自動轉置1D數組,因此需要重新調整向量形狀或添加維數,或者使用column_stack:

63987869b22e45d59a9ee734003baad8.jpeg

如果僅僅是向數組的邊界添加常量值,pad函數是足夠的:

8a6bedb92254484b98668cec1be5559c.jpeg

Meshgrids

廣播機制使得meshgrids變得容易。例如需要下圖所示(但尺寸大得多)的矩陣:

5203c6f33dca4a93856ed65083d1e8d6.jpeg

上述兩種方法由于使用了循環,因此都比較慢。MATLAB通過構建meshgrid處理這種問題。

18f9f00597574fed81b0554a415b2538.jpeg

meshgrid函數接受任意一組索引,通過切片和索引生成完整的索引范圍,然后,函數根據I和J實現運算。

在NumPy中有一種更好的方法,無需在內存中存儲整個I和J矩陣(雖然meshgrid已足夠優秀,僅存儲對原始向量的引用),僅存儲形狀矢量,然后通過廣播規實現其余內容的處理:

fb3bb43d20e8469e88edb60366612de6.jpeg

如果沒有indexing =’ij‘參數,那么meshgrid將更改參數的順序,即J,I=np.meshgrid(j,i)——一種用于可視化3D繪圖的“xy”模式(祥見該文檔)。

除了在二維或三維網格上初始化函數外,網格還可以用于索引數組:

67dbf0b6296b484bbb5cf425e2d8b8f0.jpeg

以上方法在稀疏網格中同樣適用。

矩陣統計

就像sum函數,numpy提供了矩陣不同軸上的, , mean/median/percentile, 等函數。

08aeca141b3e471abd44bafbf0068754.jpeg

np.amin等同于np.min,這樣做同樣是為了避免from numpy import *可能的歧義。

2維及更高維中的argmin和argmax函數分別返回最小和最大值的索引,通過unravel_index函數可以將其轉換為二維坐標:

c6c3a9d24cde4e68895b10d316530110.jpeg

和同樣也可作用于特定維度:

d8024aae44df4ac8bc0d3c6e556ac95f.jpeg

矩陣排序

雖然在前文中,axis參數適用于不同函數,但在二維數組排序中影響較小:

f5c58db2fa834288a948df92b649c611.jpeg

你通常不需要上述這樣的排序矩陣,axis不是key參數的替代。但好在NumPy提供了其他功能,這些功能允許按一列或幾列進行排序:

1、a[a [:,0] .argsort]表示按第一列對數組進行排序:

ea3face6f1864319bc642b1d4cef23e2.jpeg

其中,argsort返回排序后的原始數組的索引數組。

可以重復使用該方法,但千萬不要搞混:

a = a[a[:,2].argsort]

a = a[a[:,1].argsort(kind=’stable‘)]

a = a[a[:,0].argsort(kind=’stable‘)]

bc98e7514fbb47479b2fb9cf5b926243.jpeg

2、函數lexsort可以像上述這樣對所有列進行排序,但是它總是按行執行,并且排序的行是顛倒的(即從下到上),其用法如下:

a[np.lexsort(np.flipud(a[2,5].T))],首先按第2列排序,然后按第5列排序;a[np.lexsort(np.flipud(a.T))],從左到右依次排序各列。

eeff0ba90e504818a3087977b585f678.jpeg

其中,沿上下方向翻轉矩陣(沿axis = 0方向,與a [::-1,。。.]等效,其中。。.表示“其他所有維度”),注意區分它與,fliplr用于1維數組。

3、sort函數還有一個order參數,但該方法極不友好,不推薦學習。

4、在pandas中排序也是不錯的選擇,因為在pandas中操作位置確定,可讀性好且不易出錯:

- pd.DataFrame(a).sort_values(by=[2,5]).to_numpy,先按第2列排序,再按第5列排序。

-pd.DataFrame(a).sort_values.to_numpy,按從左到右的順序對所有列進行排序。

3、3維及更高維數組

通過重塑1維向量或轉換嵌套Python列表來創建3維數組時,索引分別對應(z,y,x)。索引z是平面編號,(y,x)坐標在該平面上移動:

7ffcbdb8e4cf43df924baccc119cea05.jpeg

通過上述索引順序,可以方便的保留灰度圖像,a[i]表示第i個圖像。

但這樣的索引順序并不具有廣泛性,例如在處理RGB圖像時,通常使用(y,x,z)順序:首先是兩個像素坐標,然后才是顏色坐標(中的RGB,中的BGR):

bbb248eb40084b4cb4fedf3c9719265b.jpeg

這樣可以方便地定位特定像素,如a[i,j]給出像素(i,j)的RGB元組。

因此,幾何形狀的創建實際取決于你對域的約定:

44c8538e3baf4c44924cf7fee20985bd.jpeg

顯然,hstack,vstack或dstack之類的NumPy函數并不一定滿足這些約定,其默認的索引順序是(y,x,z),RGB圖像順序如下:

1fddbeb219bb4c5a82bc145b7f8496d0.jpeg

如果數據不是這樣的布局,使用concatenate命令可以方便的堆疊圖像,并通過axis參數提供索引號:

6eb94d6f66e04373bf84057c51806247.jpeg

如果不考慮軸數,可以將數組轉換hstack和相應形式:

019d5f365a1a48f49eab51348e471d15.jpeg

這種轉換非常方便,該過程只是混合索引的順序重排,并沒有實際的復制操作。

通過混合索引順序可實現數組轉置,掌握該方法將加深你對3維數據的了解。根據確定的軸順序,轉置數組平面的命令有所不同:對于通用數組,交換索引1和2,對于RGB圖像交換0和1:

752976ddc4fc4e7e8405aac23dac7986.jpeg

注意,(a.T)的默認軸參數會顛倒索引順序,這不同于上述述兩種索引順序。

廣播機制同樣適用多維數組,更多詳細信息可參閱筆記“ ”。

最后介紹(Einstein summation)函數,這將使你在處理多維數組時避免很多Python循環,代碼更為簡潔:

b8583cfd91004061b57b7d7fcc7e361c.jpeg

該函數對重復索引的數組求和。在一般情況下,使用np.tensordot(a,b,axis=1)就可以,但在更復雜的情況下,einsum速度更快,讀寫更容易。

如果你想看看自己的NumPy水平到底如何,可以在GitHub上進行練習——例如。

對于本文未介紹到的NumPy常用功能,歡迎各位讀者通過、給我留言,我將進一步完善本文!

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 核心
    +關注

    關注

    0

    文章

    44

    瀏覽量

    15025
  • 矩陣
    +關注

    關注

    0

    文章

    422

    瀏覽量

    34504
  • 向量
    +關注

    關注

    0

    文章

    55

    瀏覽量

    11660
收藏 人收藏

    評論

    相關推薦

    [教程] Matlab中矩陣向量數組元素的引用方法和討論

    是1*1的包含1個元素的二數組ans =11ans =1ans =22.矩陣(matrix):一般特指二數組,其它與
    發表于 05-07 21:48

    如何在labview中實現二DFT?

    labview中實現對矩陣分別進行列運算和行運算。是先把二矩陣按照列向量和行向量的順序分別轉換成一
    發表于 06-27 05:23

    1數組轉2數組

    1數組轉2數組PCB打樣找華強 http://www.hqpcb.com 樣板2天出貨
    發表于 11-17 19:27

    C語言二數組的定義和引用

    ], a[2][3]二數組概念上是二的,即是說其下標在兩個方向上變化,下標變量在數組中的位
    發表于 07-12 08:55

    基于雜波協方差矩陣特征向量分析STAP降方法

    基于雜波協方差矩陣特征向量分析STAP降方法 本文在對雜波協方差矩陣的特征值、陣特征向量做出分析的基礎上,討論了無信噪比損失的降
    發表于 10-21 08:51 ?1683次閱讀
    基于雜波協方差<b class='flag-5'>矩陣</b>特征<b class='flag-5'>向量</b>分析STAP降<b class='flag-5'>維</b>方法

    靈活運用Python中numpy庫的矩陣運算

    import numpy as np; #這個方式使用numpy的函數時,需要以np.開頭。 2.矩陣的創建 由一或二數據創建
    發表于 11-15 20:07 ?2311次閱讀

    C語言程序設計教程之二數組如何應用二數組的資料概述

    本文檔的主要內容詳細介紹的是C語言程序設計教程之二數組如何應用二數組的資料概述主要內容包括了:1 了解二
    發表于 10-26 16:48 ?3次下載

    MATLAB入門教程之MATLAB矩陣數組的表示詳細資料介紹

    本文檔的主要內容詳細介紹的是MATLAB入門教程之MATLAB矩陣數組的表示詳細資料介紹主要內容包括了:1.數組概念2.一
    發表于 10-31 08:00 ?0次下載

    MATLAB教程之數組矩陣的介紹及運算說明

    本文檔的主要內容詳細介紹的是MATLAB教程之數組矩陣的介紹及運算說明主要內容包括了:1 數組的創建,2 矩陣的代數運算,3
    發表于 01-04 14:55 ?0次下載
    MATLAB教程之<b class='flag-5'>數組</b>和<b class='flag-5'>矩陣</b>的介紹及運算說明

    NumPy 誕生過去15年后 其核心開發團隊的論文終于在 Nature 上發表

    了: 功能強大的 N 數組對象。 精密廣播功能函數。 集成 C/C++ 和 Fortran 代碼的工具。 強大的線性代數、傅立葉變換和隨機數功能 今日,NumPy 核心開發團隊的論文
    的頭像 發表于 09-21 16:25 ?3178次閱讀
    <b class='flag-5'>NumPy</b> 誕生過去15年后  其<b class='flag-5'>核心</b>開發團隊的論文終于在 Nature 上發表

    圖文詳解NumPy看這一篇就夠了

    寫下來,讓學習過程變得輕松有趣。在Reddit機器學習社區發布不到半天就收獲了500+贊。 下面就讓我們跟隨他的教程一起來學習吧! 教程內容分為向量?(一數組)、矩陣?(二
    的頭像 發表于 05-26 09:45 ?3242次閱讀
    圖文詳解<b class='flag-5'>NumPy</b>看這一篇就夠了

    Numpy詳解-軸的概念

    NumPy數組數稱為秩(rank),一數組的秩為1,二
    的頭像 發表于 04-25 10:25 ?2874次閱讀

    數組數組指針以及指針數組

    數組數組指針以及指針數組
    的頭像 發表于 08-16 09:02 ?2587次閱讀

    C語言二數組的定義

    按以上定義,數組a課用的下標范圍為0~2,“列下標”的范圍為0~3,。用a[3][4]表示元素顯然超過了數組的范圍。 讀者要嚴格區分在定義數組
    的頭像 發表于 03-09 11:38 ?2046次閱讀

    python怎么創建二數組

    如何創建二數組在Python中是一個常見的問題。在Python中,我們可以使用嵌套的列表(list of lists)或者使用NumPy庫來創建二
    的頭像 發表于 11-21 15:10 ?3657次閱讀