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 ...