- 從困惑到解惑
- 當(dāng)你困惑時,甚至需要顛覆世界觀思灰,原本的知識體系造成的理所當(dāng)然的直覺恰恰相反,像騎了一個往前蹬卻往后走的自行車一樣別扭難受--反直覺(Counter Intuitive)
- 找到一個完美教程非常難得
- 逐字不差的閱讀且逐字不差的翻譯
- 借助翻譯軟件(節(jié)省時間打字)
- 學(xué)好數(shù)據(jù)分析洒疚,得學(xué)好Numpy坯屿;學(xué)好Numpy巍扛,首先徹底理解“軸”的概念
閱讀原文:
解釋Numpy軸(axes)
本教程將介紹NumPy軸。
它將解釋NumPy軸是什么撤奸。本教程還將解釋軸如何工作,以及我們?nèi)绾螌⑺鼈兣cNumPy函數(shù)一起使用胧瓜。
在我詳細解釋NumPy軸之前,讓我先解釋為什么NumPy軸存在問題蒲肋。
NUMPY AXES很難理解
坦白來說。
NumPy軸是NumPy系統(tǒng)中最難理解的事情之一兜粘。如果您剛剛開始使用NumPy弯蚜,則尤其如此妹沙。許多初學(xué)者都很難理解NumPy軸的工作原理熟吏。
別擔(dān)心,不是你牵寺。許多Python數(shù)據(jù)科學(xué)初學(xué)者都在努力解決這個問題。
話雖如此趣斤,本教程將解釋您需要了解的有關(guān)NumPy數(shù)組中的軸的所有基本知識。
讓我們從基礎(chǔ)開始浓领。通過將NumPy軸連接到您已經(jīng)知道的東西势腮,我將使NumPy軸更容易理解。
NUMPY AXES類似于在坐標(biāo)系中的軸
如果您正在閱讀這篇博文捎拯,那么您可能需要參加幾門數(shù)學(xué)課程。
當(dāng)你第一次學(xué)習(xí)圖形時,回想一下早期的數(shù)學(xué)吗浩。您了解了笛卡爾坐標(biāo)。
NumPy軸與笛卡爾坐標(biāo)系中的軸非常相似懂扼。
類比:笛卡爾坐標(biāo)系坐標(biāo)軸
簡單的二維笛卡爾坐標(biāo)系具有兩個軸右蒲,即x軸和y軸微王。
這些軸基本上只是笛卡爾空間中的方向(正交方向)品嚣。
此外,我們可以通過它沿每個軸的位置來識別笛卡爾空間中點的位置翰撑。
NUMPY 的軸是行和列的方向
就像坐標(biāo)系一樣眶诈,NumPy陣列也有軸涨醋。
在二維NumPy數(shù)組中逝撬,軸是沿行和列的方向。
AXIS 0是沿著行的方向
假設(shè)我們討論的是多維數(shù)組溯警,那么軸0就是向下行的軸。
請記住梯轻,這確實適用于二維數(shù)組和多維數(shù)組尽棕。一維數(shù)組是一個特例,我將在本教程的后面解釋滔悉。
AXIS 1是沿著列的方向
在多維NumPy陣列中,axis1是第2軸回官。當(dāng)我們談?wù)摱S和多維數(shù)組時,axis1是橫跨列水平延伸的軸浙炼。
再一次唯袄,請記住弯屈,一維數(shù)組的工作方式略有不同恋拷。從技術(shù)上講,1-d陣列沒有軸1.我將在本教程后面詳細解釋蔬顾。
NUMPY ARRAY AXES以'0'開頭
在這一點上可能很明顯,但我應(yīng)該指出NumPy中的數(shù)組軸是編號的诀豁。
重要的是,它們從0開始編號娩践。
這就像Python序列的索引值一樣烹骨。在Python序列中 - 如列表和元組 - 序列中的值具有與之關(guān)聯(lián)的索引翻伺。
所以沮焕,假設(shè)我們有一個帶有幾個大寫字母的Python列表:
alpha_list = ['A','B','C','D']
如果我們檢索第一個項目的索引值('A')......
alpha_list.index('A')
......我們發(fā)現(xiàn)'A'位于索引位置0。
這里辣辫,A是列表中的第一項,但索引位置為0络它。
基本上所有的Python序列都是這樣的歪赢。在任何Python序列中 - 如列表化戳,元組或字符串 - 索引從0開始埋凯。
NumPy軸的編號基本上以相同的方式工作。它們從0開始編號白对。因此“第一”軸實際上是“axis0”◇扒疲“第二”軸是“axis1”沉颂,依此類推悦污。
Numpy數(shù)組中軸的結(jié)構(gòu)是重要的
在下一節(jié)中,我將向您展示如何在NumPy中使用NumPy軸的示例切端,但在我向您展示之前,您需要記住NumPy數(shù)組的結(jié)構(gòu)很重要昌屉。
我剛才解釋的細節(jié),關(guān)于軸編號间驮,以及哪個軸將影響您對我們使用的NumPy函數(shù)的理解马昨。話雖如此竞帽,在繼續(xù)討論示例之前偏陪,請確保您真正理解我上面解釋的有關(guān)Numpy軸的細節(jié)。
如果您有任何疑問或者您仍然對NumPy軸感到困惑笛谦,請在頁面底部的注釋中留下問題。
好】已現(xiàn)在灶轰,讓我們繼續(xù)討論這些例子谣沸。
關(guān)于如何使用NUMPY軸的示例
既然我們已經(jīng)解釋了NumPy軸的工作原理笋颤,那么讓我們看一下NumPy軸如何使用的一些具體例子。
這些示例很重要伴澄,因為它們有助于培養(yǎng)您對NumPy軸在與NumPy函數(shù)一起使用時如何工作的直覺。
這尼瑪也太多了举农!還是挑重點把!0湓恪!
建議:注意軸參數(shù)控制的內(nèi)容
要了解如何在NumPy函數(shù)中使用axis參數(shù)棱貌,了解axis參數(shù)實際控制每個函數(shù)的內(nèi)容非常重要。
這聽起來并不總是那么簡單键畴。例如突雪,在np.sum()函數(shù)中,axis參數(shù)的行為方式很多人認(rèn)為是反直覺的惹想。
我將在一分鐘內(nèi)解釋它是如何工作的,但我需要強調(diào)這一點:非常注意axis參數(shù)實際控制每個函數(shù)的內(nèi)容嘀粱。
NUMPY SUM
在嘗試?yán)斫釴umPy sum中的axis時辰狡,您需要知道axis參數(shù)實際控制的是什么锋叨。
在np.sum()中宛篇,axis參數(shù)控制將聚合哪個軸。
換句話說偷卧,axis參數(shù)控制哪個軸將被折疊。
請記住听诸,sum()蚕泽,mean()晌梨,min()须妻,median()和其他統(tǒng)計函數(shù)等函數(shù)會聚合您的數(shù)據(jù)。
為了解釋“聚合”的含義掌逛,我將舉一個簡單的例子。
想象一下豆混,你有一組5個數(shù)字。如果總結(jié)這5個數(shù)字皿伺,結(jié)果將是一個數(shù)字。求和有效地匯總了您的數(shù)據(jù)鸵鸥。它將大量的值折疊為單個值。
類似地宋税,當(dāng)您在帶有axis參數(shù)的二維數(shù)組上使用np.sum()時讼油,它會將二維數(shù)組折疊為一維數(shù)組杰赛。它會折疊數(shù)據(jù)并減少維度矮台。
但哪個軸會被折疊?
將NumPy和函數(shù)與axis參數(shù)一起使用時辰晕,指定的軸是折疊的軸。
NUMPY SUM WITH AXIS = 0
在這里含友,我們將使用軸= 0的NumPy和函數(shù)蝉娜。
創(chuàng)建一個簡單的NumPy數(shù)組唱较。
np_array_2d = np.arange(0, 6).reshape([2,3])
print(np_array_2d)
[[0 1 2]
[3 4 5]]
接下來召川,讓我們使用axis= 0的NumPy求和函數(shù)sum。
np.sum(np_array_2d, axis = 0)
輸出:array([3, 5, 7])
當(dāng)我們設(shè)置axis = 0時汉形,該函數(shù)實際上對列進行求和。結(jié)果是一個新的NumPy數(shù)組概疆,其中包含每列的總和峰搪。為什么?軸0不是指行嗎概耻?
這讓許多初學(xué)者感到困惑罐呼,所以讓我解釋一下。
正如我之前提到的嫉柴,axis參數(shù)指示哪個軸折疊奉呛。
因此,當(dāng)我們設(shè)置axis = 0時瞧壮,我們不會對行進行求和。當(dāng)我們設(shè)置axis = 0時馁痴,我們正在聚合數(shù)據(jù)肺孤,以便我們折疊行......我們將軸0折疊。
AXIS = 1的NUMPY SUM
print(np_array_2d)
[[0 1 2]
[3 4 5]]
np.sum(np_array_2d, axis = 1)
array([3, 12])
同樣小渊,使用sum()函數(shù),axis參數(shù)設(shè)置在求和過程中折疊的軸茫叭。
代碼具有跨列求和的效果。它折疊了axis1揍愁。
NUMPY CONCATENATE
現(xiàn)在讓我們來看一個不同的例子呐萨。
在這里莽囤,我們將在使用NumPy連接函數(shù)(np.concatenate())的上下文中使用axis參數(shù)。
當(dāng)我們將axis參數(shù)與np.concatenate()函數(shù)一起使用時惨远,axis參數(shù)定義了我們堆疊數(shù)組的軸。
看例子:
np_array_1s = np.array([[1,1,1],[1,1,1]])
np_array_9s = np.array([[9,9,9],[9,9,9]])
array([[1, 1, 1],
[1, 1, 1]])
array([[9, 9, 9],
[9, 9, 9]])
#*use NumPy concatenate with axis = 0*
np.concatenate([np_array_1s, np_array_9s], axis = 0)
#輸出
array([[1, 1, 1],
[1, 1, 1],
[9, 9, 9],
[9, 9, 9]])
讓我們仔細評估語法在這里做了什么北秽。
#*use NumPy concatenate with axis = 1*
np.concatenate([np_array_1s, np_array_9s], axis = 1)
#輸出
array([[1, 1, 1, 9, 9, 9],
[1, 1, 1, 9, 9, 9]])
但是最筒,讓我們快速回顧一下這里發(fā)生了什么。
警告:1維陣列的工作方式不同
希望這個NumPy軸教程可以幫助您了解NumPy軸的工作原理辙培。
但在我結(jié)束教程之前,我想給你一個警告:一維數(shù)組的工作方式不同虏冻!
一維NUMPY數(shù)組只有一個軸(即axis=0)
示例:連接1-D陣列(一維數(shù)組)
np_array_1s_1dim = np.array([1,1,1])
np_array_9s_1dim = np.array([9,9,9])
[1 1 1]
[9 9 9]
np.concatenate([np_array_1s_1dim, np_array_9s_1dim], axis = 0)
array([1, 1, 1, 9, 9, 9])
這個輸出讓許多初學(xué)者感到困惑。數(shù)組水平連接在一起领曼。
這與函數(shù)在二維數(shù)組上的工作方式不同。如果我們在二維數(shù)組上使用np.concatenate()和axis = 0庶骄,則數(shù)組將垂直連接在一起践磅。
在這種情況下,該功能正常工作府适。NumPy連接是沿著軸0連接這些數(shù)組。問題是在1-d數(shù)組中檐春,軸0不像在2維數(shù)組中那樣指向“向下”。
示例:連接1-D陣列時的報錯疟暖,AXIS = 1
np.concatenate([np_array_1s_1dim, np_array_9s_1dim], axis = 1)
IndexError: axis 1 out of bounds [0, 1)
一位數(shù)組只有一個軸。
總結(jié):
- 將NumPy軸視為我們可以執(zhí)行操作的方向俐巴。
- 將NumPy軸視為我們可以執(zhí)行操作的方向。
- 將NumPy軸視為我們可以執(zhí)行操作的方向擎鸠。