• <sub id="pqc61"><p id="pqc61"></p></sub><sub id="pqc61"></sub>
    在线精品视频一区二区,亚洲中文字幕无码一久久区,正在播放肥臀熟妇在线视频,国内精品视频一区二区三区八戒 ,国产毛片三区二区一区,国产精品一区中文字幕,丰满少妇被猛烈进出69影院,国产成人无码
    您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號安全和更好的產(chǎn)品體驗,強烈建議使用更快更安全的瀏覽器
    此為臨時鏈接,僅用于文章預覽,將在時失效
    人工智能開發(fā)者 正文
    發(fā)私信給AI研習社-譯站
    發(fā)送

    0

    圖解 | NumPy可視化指南

    本文作者: AI研習社-譯站 2021-01-28 14:20
    導語:本文受 JayAlammar 的文章“ A Visual Intro to NumPy”的啟發(fā),并對其做了更詳細豐富的介紹。

    譯者:AI研習社(季一帆

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


    圖解 | NumPy可視化指南

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

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

    1. 向量——一維數(shù)組

    2. 矩陣——二維數(shù)組

    3. 3維及更高維數(shù)組

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

    numpy數(shù)組 vs. Python列表

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

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

    圖解 | NumPy可視化指南

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

    • 更緊湊,高維時尤為明顯

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

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

    • 元素類型一般比較固定

    圖解 | NumPy可視化指南

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

    1.向量與1維數(shù)組

    向量初始化

    通過Python列表可以創(chuàng)建NumPy數(shù)組,如下將列表元素轉(zhuǎn)化為一維數(shù)組:

    圖解 | NumPy可視化指南

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

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

    圖解 | NumPy可視化指南

    通過以下方法可以創(chuàng)建一個與某一變量形狀一致的空數(shù)組:

    圖解 | NumPy可視化指南

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

    圖解 | NumPy可視化指南

    在NumPy中,還可以通過單調(diào)序列初始化數(shù)組:

    圖解 | NumPy可視化指南

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

    arange浮點類型數(shù)據(jù)不是非常友好:

    圖解 | NumPy可視化指南

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

    隨機數(shù)組的生成如下:

    圖解 | NumPy可視化指南

    向量索引

    對于數(shù)組數(shù)據(jù)的訪問,numpy提供了便捷的訪問方式:

    圖解 | NumPy可視化指南

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

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

    圖解 | NumPy可視化指南

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

    圖解 | NumPy可視化指南

    anyall與其他Python使用類似

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

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

    圖解 | NumPy可視化指南

    向量操作

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

    圖解 | NumPy可視化指南

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

    浮點數(shù)的計算也是如此,numpy能夠?qū)肆繌V播到數(shù)組:

    圖解 | NumPy可視化指南

    numpy提供了許多數(shù)學函數(shù)來處理矢量:

    圖解 | NumPy可視化指南

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

    圖解 | NumPy可視化指南

    numpy也提供了如下三角函數(shù)運算:

    圖解 | NumPy可視化指南

    數(shù)組整體進行四舍五入:

    圖解 | NumPy可視化指南

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

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

    numpy還可以實現(xiàn)以下功能:

    圖解 | NumPy可視化指南

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

    在numpy中,排序函數(shù)功能有所閹割:

    圖解 | NumPy可視化指南

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

    查找向量中的元素

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

    圖解 | NumPy可視化指南

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

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

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

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

    實際上,通過C實現(xiàn)加速搜索并不是困難,問題是浮點數(shù)據(jù)比較。

    浮點數(shù)比較

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

    圖解 | NumPy可視化指南

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

    • math.isclose不對要比較的數(shù)字做任何假設,而是需要用戶提供一個合理的abs_tol值(np.allclose默認的atol值1e-8足以滿足小數(shù)位數(shù)為1的浮點數(shù)比較,即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上的浮點數(shù)據(jù)指南和相應的NumPy問題了解更多信息。

    2.矩陣和二維數(shù)組

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

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

    圖解 | NumPy可視化指南

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

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

    圖解 | NumPy可視化指南

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

    圖解 | NumPy可視化指南

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

    軸參數(shù)

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

    圖解 | NumPy可視化指南

    矩陣運算

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

    圖解 | NumPy可視化指南

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

    圖解 | NumPy可視化指南

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

    圖解 | NumPy可視化指南

    行向量與列向量

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

    圖解 | NumPy可視化指南

    使用newaxis更新數(shù)組形狀和索引可以將1維數(shù)組轉(zhuǎn)化為2維列向量:

    圖解 | NumPy可視化指南

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

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

    圖解 | NumPy可視化指南

    根據(jù)廣播規(guī)則,一維數(shù)組被隱式解釋為二維行向量,因此通常不必在這兩個數(shù)組之間進行轉(zhuǎn)換,對應圖中陰影化區(qū)域。

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

    矩陣操作

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

    圖解 | NumPy可視化指南

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

    圖解 | NumPy可視化指南

    與stack對應的是split:

    圖解 | NumPy可視化指南

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

    圖解 | NumPy可視化指南

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

    圖解 | NumPy可視化指南

    相應插入操作為insert

    圖解 | NumPy可視化指南

    與hstack一樣,append函數(shù)無法自動轉(zhuǎn)置1D數(shù)組,因此需要重新調(diào)整向量形狀或添加維數(shù),或者使用column_stack:

    圖解 | NumPy可視化指南

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

    圖解 | NumPy可視化指南

    Meshgrids

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

    圖解 | NumPy可視化指南

    上述兩種方法由于使用了循環(huán),因此都比較慢。MATLAB通過構建meshgrid處理這種問題。
    圖解 | NumPy可視化指南

    meshgrid函數(shù)接受任意一組索引,通過mgrid切片和indices索引生成完整的索引范圍,然后,fromfunction函數(shù)根據(jù)I和J實現(xiàn)運算。

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

    圖解 | NumPy可視化指南

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

    除了在二維或三維網(wǎng)格上初始化函數(shù)外,網(wǎng)格還可以用于索引數(shù)組:

    圖解 | NumPy可視化指南

    以上方法在稀疏網(wǎng)格中同樣適用。

    矩陣統(tǒng)計

    就像sum函數(shù),numpy提供了矩陣不同軸上的min/maxargmin/argmaxmean/median/percentilestd/var等函數(shù)。

    圖解 | NumPy可視化指南

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

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

    圖解 | NumPy可視化指南

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

    圖解 | NumPy可視化指南

    矩陣排序

    雖然在前文中,axis參數(shù)適用于不同函數(shù),但在二維數(shù)組排序中影響較?。?/p>

    圖解 | NumPy可視化指南

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

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

    圖解 | NumPy可視化指南

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

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

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

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

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

    圖解 | NumPy可視化指南

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

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

    圖解 | NumPy可視化指南

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

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

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

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

    -pd.DataFrame(a).sort_values().to_numpy(),按從左到右的順序?qū)λ辛羞M行排序。

    3、3維及更高維數(shù)組

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

    圖解 | NumPy可視化指南

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

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

    圖解 | NumPy可視化指南

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

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

    圖解 | NumPy可視化指南

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

    圖解 | NumPy可視化指南

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

    圖解 | NumPy可視化指南

    如果不考慮軸數(shù),可以將數(shù)組轉(zhuǎn)換hstack和相應形式:

    圖解 | NumPy可視化指南

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

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

    圖解 | NumPy可視化指南

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

    廣播機制同樣適用多維數(shù)組,更多詳細信息可參閱筆記“ NumPy中的廣播”。

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

    圖解 | NumPy可視化指南

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

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

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

    參考

    1. Scott Sievert, NumPy GPU acceleration

    2. Jay Alammar, A Visual Intro to NumPy and Data Representation

    3. Big-O Cheat Sheet site

    4. Python Time Complexity wiki page

    5. NumPy Issue #14989, Reverse param in ordering functions

    6. NumPy Issue #2269, First nonzero element

    7. Numba library homepage

    8. The Floating-Point Guide, Comparison

    9. NumPy Issue #10161, numpy.isclose vs math.isclose

    10. 100 NumPy exercises on GitHub


    AI研習社是AI學術青年和AI開發(fā)者技術交流的在線社區(qū)。我們與高校、學術機構和產(chǎn)業(yè)界合作,通過提供學習、實戰(zhàn)和求職服務,為AI學術青年和開發(fā)者的交流互助和職業(yè)發(fā)展打造一站式平臺,致力成為中國最大的科技創(chuàng)新人才聚集地。

    如果,你也是位熱愛分享的AI愛好者。歡迎與譯站一起,學習新知,分享成長。

    圖解 | NumPy可視化指南

    圖解 | NumPy可視化指南

    分享:
    相關文章

    知情人士

    AI研習社(yanxishe.com)譯站頻道,傳播前沿人工智能知識,讓語言不再成為學習知識的門檻。(原雷鋒字幕組)
    當月熱門文章
    最新文章
    請?zhí)顚懮暾埲速Y料
    姓名
    電話
    郵箱
    微信號
    作品鏈接
    個人簡介
    為了您的賬戶安全,請驗證郵箱
    您的郵箱還未驗證,完成可獲20積分喲!
    請驗證您的郵箱
    立即驗證
    完善賬號信息
    您的賬號已經(jīng)綁定,現(xiàn)在您可以設置密碼以方便用郵箱登錄
    立即設置 以后再說
    主站蜘蛛池模板: 亚洲人人妻| 日韩精品中文字幕国产一| 女人毛片视频永久免费| 国产一区二区不卡在线看| 人妻综合第一页| 国产 麻豆 日韩 欧美 久久| 鄯善县| 人妻久久久一区二区三区| 中文字幕有码在线第十页| 日本无码中文| 亚洲天堂欧美| 精品一区二区三区免费观看| 熟女人妻aⅴ一区二区三区电影| 爆乳日韩尤物无码一区| 免费观看全黄做爰的视频 | 亚洲熟妇自偷自拍另类| 国产69精品久久久久99尤物| 国产精品爽爽久久久久久蜜臀 | 久9re热视频这里只有精品免费| 正在播放国产多p交换视频| 国产二区三区视频在线| 久久一夜天堂av一区二区| 91在线观看免费高清| www.国产在线观看| 99热这里都是国产精品| 精品国产污污免费网站| 国产成人综合网亚洲第一| 色七七亚洲人妻免费在线| 日韩美女久久99美女网站| 国产精品疯狂输出jk草莓视频| 久久综合图区亚洲综合图区| 青娱乐极品丝袜| 国产日本一区二区精品| 一区二区日韩无码| 一本色道久久综合亚洲精品按摩| 久久热这里这里只有精品| 久久亚洲精品情侣| 94人妻少妇偷人精品| 亚洲欧美中文v日韩v在线| 激情视频乱一区二区三区| 国产精品99久久久久久噜噜|