Numpy和Pandas中axis引數理解

2021-08-21 04:35:27 字數 3463 閱讀 3548

numpy和pandas是資料處理中常用的庫,numpy和pandas許多函式都有axis這個引數,傳入axis引數可以指定在哪個軸上操作,但是使用axis到底該指定哪個軸,這帶了很多的困惑。下面我們就來分析一下,axis是怎麼指定不同的軸的,以及指定不同的軸,是怎樣操作的。pandas保持了numpy對關鍵字axis的用法,在此我們以numpy為例進行解釋。

numpy的array有個shape屬性,如:

import numpy as np

np.random.seed(123)

x=np.random.randint(0,5,[2,3,2])

print (x)

print (x.shape)

[[[2 4]

[2 1]

[3 2]]

[[3 1]

[1 0]

[1 1]]]

(2, 3, 2)

可以看到生成的是乙個三維的隨機數組,axis=0就對應shape的用第0個元素對應的維度,axis=1對應shape的用第1個元素對應的維度,axis=2對應shape的用第2個元素對應的維度。即 axis=0,1,2 表示從外到內的維度。(2, 3, 2) 表示包含2個三行兩列的陣列。

numpy中的axis的設定引數與陣列的shape有關

例如乙個shape(3,2,4)的陣列,代表乙個三維陣列,要注意的是這裡的維度與物理學的維度的理解是不太一樣的

axis = 0時,就相當於所求的陣列的結果變成shape(2,4)

axis = 1時,陣列的結果shape(3,4)

axis = 2時,陣列的結果shape(3,2)

這裡應該看出來了,當axis=n的時候shape中相應的索引就會被去除,陣列發生了降維,那麼是如何降維的呢?首先要清楚shape裡的數字都代表什麼意義:

3代表這個numpy陣列裡巢狀著3個陣列(有三層), 2代表其中每個陣列的行數,3代表其中每個陣列的列數。

>>>df = pd.dataframe([[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]], \

columns=["col1", "col2", "col3", "col4"])

>>>df

col1 col2 col3 col4

0111112

2222

3333

如果我們呼叫df.mean(axis=1),我們將得到按行計算的均值

>>> df.mean(axis=1)01

1223

然而,如果我們呼叫 df.drop((name, axis=1),我們實際上刪掉了一列,而不是一行:

>>> df.drop("col4", axis=1)

col1 col2 col301

1112

2223

33

其實問題理解axis有問題,df.mean其實是在每一行上取所有列的均值,而不是保留每一列的均值。也許簡單的來記就是axis=0代表往跨行(down),而axis=1代表跨列(across),作為方法動作的副詞(譯者注)

換句話說:

-使用0值表示沿著每一列或行標籤\索引值向下執行方法

-使用1值表示沿著每一行或者列標籤模向執行對應的方法

下圖代表在dataframe當中axis為0和1時分別代表的含義:

axis引數作用方向圖示。另外,記住,pandas保持了numpy對關鍵字axis的用法,用法在numpy庫的詞彙表當中有過解釋:軸用來為超過一維的陣列定義的屬性,二維資料擁有兩個軸:第0軸沿著行的垂直往下,第1軸沿著列的方向水平延伸。

所以問題當中第乙個列子 df.mean(axis=1)代表沿著列水平方向計算均值,而第二個列子df.drop(name, axis=1) 代表將name對應的列標籤(們)沿著水平的方向依次刪掉。即df.mean(axis=1)表示一行一行的計算均值,df.drop(name, axis=1)表示一行一行的將name列刪掉。還可以這樣理解,axis等於那個維度代表操作在哪個維度上進行,操作後該維度消失(變成1)。如df.mean(axis=1),axis=1表示均值操作在列上進行(跨列操作),即按照行相加求均值,操作後變成一列。axis指定哪個維度表示跨哪個維度進行操作。

import numpy as np

np.random.seed(123)

x=np.random.randint(0,5,[2,3,2])

print (x)

print (x.max(axis=0))

print (x.sum(axis=0))

[[[2 4]

[2 1]

[3 2]]

[[3 1]

[1 0]

[1 1]]]

[[3 4]

[2 1]

[3 2]]

[[5 5]

[3 1]

[4 3]]

x陣列的shape為(2,3,2),3代表這個numpy陣列裡巢狀著3個陣列(有三層), 2代表其中每個陣列的行數,3代表其中每個陣列的列數。x.max(axis=0)去掉第0個維度,得出的肯定是乙個3行2列的陣列。axis=0 表示跨第0個維度操作,其他維度保持不變。

>>> 

print (x.max(axis=1))

[[34]

[31]]

>>>

print (x.sum(axis=1))

[[77]

[52]]

x.max(axis=1)去掉第1個維度,得出的肯定是乙個2行2列的陣列。axis=1 表示跨第1個維度操作,其他維度保持不變。

>>> 

print (x.max(axis=2))

[[42

3] [3

11]]

>>>

print (x.sum(axis=2))

[[63

5] [4

12]]

x.max(axis=2)去掉第2個維度,得出的肯定是乙個2行3列的陣列。axis=2 表示跨第2個維度操作,其他維度保持不變。

numpy中對於axis的理解

numpy中axis理解

python之numpy(axis=0 與axis=1)區分

numpy和pandas中set option總結

import warnings import numpy as np import pandas as pd warnings.filterwarnings ignore 關閉執行時的警告 np.set printoptions linewidth 100,suppress true 列印numpy...

Numpy和Pandas的區別

首先來說說ndarray,numpy提供了乙個n維度的資料型別 ndarray 他描述了相同型別的items集合 1.ndarray中所有元素的型別都是相同的,而python列表中的元素型別是任意的,所以,ndarray在儲存元素的時候,記憶體可以連續。而python原生list就只通過定址法找到下...

python安裝numpy和pandas的方法步驟

最近要對一系列資料做同比比較,需要用到numpy和pandas來計算,不過使用python安裝numpy和pandas因為linux環境沒有外網遇到了很多問題就記下來了。首要條件,python版本必須是2.7以上。linux首先安裝依賴包 yum y install blas blas devel ...