1. 程式人生 > >numpy 下的axis(軸)詳細含義,np.expand_dims(x,axis=0),np.newaxis解釋

numpy 下的axis(軸)詳細含義,np.expand_dims(x,axis=0),np.newaxis解釋

以下舉例: 
np.array([1, 2, 3]) 
當你看以上陣列時,從1到2,到3。這就是所謂的axis=0軸 
np.array([ [1, 2], [3, 4], [4, 5] ]) 

再用相同的方法,看上面陣列,首先是從[1, 2]到 [3, 4]到[4, 5]。這就是從0軸視角看的資料,當我們選擇0軸所在的第一個元素[1, 2]時,我們看到的是從1到2。這就是從1軸看到的資料。假若有n維資料,axis=0表示最外面括號說包含的裡面所有內容,axis=1表示第2個括號裡面所包含所有內容,比如:[[[內容1],[內容2]]]。

如下圖,看一下按1軸的拼接:首先我們找到y1和y2的0軸,在對應0軸內每個元素按照1軸進行拼接。y1 0軸第一個元素[[1,0],[1,0]]與y2 0軸第一個元素[[0,0],[0,0]]按照2軸拼接成: 

[[1, 0], 
[1, 0], 
[0, 0], 
[0, 0]]
y1 = np.array([ [[1,0],[1,0]] , [[0,0],[0,0]] ])
y2 = np.array([ [[0,0],[0,0]] , [[0,1],[0,1]] ])
np.concatenate((y1,y2),axis=1)  #按軸=1拼,也就是一軸裡是怎樣的格式內容,拼接也需要與其一致,一軸在拼接結束時也要保持末端有2個括號。array([[[1, 0],        [1, 0],
        [0, 0],
        [0, 0]],#2個括號,與1軸一致,

       [[0, 0],
        [0, 0],
        [0, 1],
        [0, 1]]
])

理解numpy中的軸:

:表示當前維的所有索引值都取
import numpy as np
t = np.array(
  [
      [
          [
           [1,2,3],  
           [4,5,6]
          ],  
          [
           [7,8,9],  
           [10,11,12]
          ],  
          [
           [13,14,15],  
           [16,17,18]
          ]
      ],  
      [
          [
           [19
,20,21], [22,23,24] ], [ [25,26,27], [28,29,30] ], [ [31,32,33], [34,35,36] ] ] ])
print(t[0,:,:,:])#第0軸或者說第4維(也就是第一個[])下的第一項所有的資料
[[[ 1  2  3]
  [ 4  5  6]]

 [[ 7  8  9]
  [10 11 12]]

 [[13 14 15]
  [16 17 18]]]
print(t[:,0,:,:])#第axis=1軸或者第2個[]下說包含的第一項所有資料
[[[ 1  2  3]
  [ 4  5  6]]

 [[19 20 21]
  [22 23 24]]]
print(t[:,:,0,:])
[[[ 1  2  3]
  [ 7  8  9]
  [13 14 15]]

 [[19 20 21]
  [25 26 27]
  [31 32 33]]]
print(t[:,:,:,0])
[[[ 1  4]
  [ 7 10]
  [13 16]]

 [[19 22]
  [25 28]
  [31 34]]]
  • np.newaxis

np.newaxis相當於新插入一個軸

a=np.array([1,2,3,4,5])
b=a[np.newaxis,:]#插在最前面,從左到右,就按照從高維到低維位置排,在最面加個括號,增加了一維
print a.shape,b.shape
print a
print b

輸出結果:
(5,) (1, 5)
[1 2 3 4 5]
[[1 2 3 4 5]]
a=np.array([1,2,3,4,5])
b=a[:,np.newaxis]#插在第二個位置,從左到右,就按照從高維到低維位置排,在裡面加個括號
print a.shape,b.shape
print a
print b

輸出結果
(5,) (5, 1)
[1 2 3 4 5]
[[1]
 [2]
 [3]
 [4]
 [5]]
  • numpy.expand_dims

numpy.expand_dims同樣是用於擴充陣列維度

>>> x = np.array([1,2])
>>> x.shape
(2,)

>>> y = np.expand_dims(x, axis=0)  #擴充最高維,等價於 x[np.newaxis,:]或x[np.newaxis]
>>> y
array([[1, 2]])
>>> y.shape
(1, 2)   #看np.newaxis位置(在:之前)可知插入在2之前

>>> y = np.expand_dims(x, axis=1)  #等價於x[:,newaxis]
>>> y
array([[1],
       [2]])
>>> y.shape
(2, 1)  #看np.newaxis位置(在:之後)可知插入在2之後

>>> np.newaxis is None
True

二維情況:

x = np.array([[1,2,3],[4,5,6]])
print x
print x.shape

[[1 2 3]
 [4 5 6]]
(2, 3)#兩行三列,因為第一個大括號下有兩組list故是2,第一個大括號下的任意一組[]下又有3個數,故為3.

y = np.expand_dims(x,axis=0)#axis=0表示最外面加[]
print y
print "y.shape: ",y.shape
print "y[0][1]: ",y[0][1]

[[[1 2 3]
  [4 5 6]]]
y.shape:  (1, 2, 3)
y[0][1]:  [4 5 6]

y = np.expand_dims(x,axis=1)#在第二個[]下再加括號
print y
print "y.shape: ",y.shape
print "y[1][0]: ",y[1][0]

[[[1 2 3]]

 [[4 5 6]]]
y.shape:  (2, 1, 3)
y[1][0]:  [4 5 6]

y = np.expand_dims(x,axis=2)#在第個括號裡新增括號,以此作為新的一維
print y
print "y.shape: ",y.shape


[[[1]
  [2]
  [3]]

 [[4]
  [5]
  [6]]]
y.shape:  (2, 3, 1)總結:numpy陣列所表示的很多[]層層巢狀來表示的話,為了理解記憶,從最左邊數,有多少[[[,一般表示是多少維資料.在y.shape下則就有(,,)括號中多少減1個逗號。(,,,,)內從左到右表示響應的[[[[下的維數,由高維到低維,比如:y.shape:  (2, 3, 1),則(從左到右相對應axis=0到axis=2)。y.shape:  (2, 3, 1)中的2表示最高維0軸下有兩組list;3表示在每個axis=1軸(前提是在0軸的基礎下)下有3組list;最後1表示在每個的axis=2軸下有一組list。以前總會把axis=0死記為表示行,1就表示列,如果是二維資料,就沒錯。更高維就不行了。所以要理解裡面數字相對於numpy陣列一一對應的關係是怎樣的,這是我的個人理解,很口語化,為了防止日後忘記,便記錄於此。以下有numpy官網的部分介紹點選開啟連結