1. 程式人生 > >關於PYTHON NUMPY陣列的切片的符號省略問題

關於PYTHON NUMPY陣列的切片的符號省略問題

在看Numpy學習指南時,看陣列切片部分有點暈菜

比如 b = np.arange(24).reshape(2,3,4)

生成了一個三維陣列,

array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],


       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

然後切片,各種切

b[0]

b[0,0]

b[0,0,0]

這還能明白些,然後加入了冒號“:”,開始冒汗了。

b[:,0,0]

b[0,:,:]

b[0,1,::2]

b[:,1]

b[0,:,-1]

b[0,::-1,-1]

不知道大家看懂沒,反正我是沒看懂。

想了很久之後才算明白。其實把切片形式補全就明白了。

如果我們選整個陣列b,那麼它的切片完整形式應該是

即整個b等價於

b[0:2:1, 0:3:1, 0:4:1]

即【第1維起點:終點:步長, 第2維 ...,第3維】

為了簡化,那麼規定,

1.步長為1可以省略, b[0:2:, 0:3:, 0:4:] (注:當然和步長一起的冒號也可以省略,成如下格式b[0:2, 0:3, 0:4],為了便於理解我們還是先保留這個冒號)

2. 終點為自然終點,可以省略,b[0::, 0::, 0::](注:可以省略成b[0:,0:,0:],不能省略成b[0,0,0])

3. 起點為自然起點,可以省略,b[::,::,::](注:可以省略成b[:,:,:],不能省略成b[,,])

再往下省略就和前面不太一樣了。

比如 b[::,::,::] ,最右邊的,如果都是省略形式,那麼也可以省略,從右邊開始省略,先是冒號省略b[::,::,],然後是逗號省略b[::,::],依次b[::,],b[::],b[:](注:不能省略成b[]),最後就是省略成b了。

如果右邊不是簡略形式,就不能省略,像b[::,::,::2]就不能省略成b[,,::2]

如果想成左邊開始省略的,前面可以加...  即b[..., ::2]