2017-11-18 170 views
3

索引我寫了下面:numpy的數組索引

arr3=np.array([[[1,2,3],[1,2,3],[1,2,3],[1,2,3]],[[2,2,3],[4,2,3],[4,2,2],[2,2,2]],[[1,1,1],[1,1,1],[1,1,1],[1,1,1]]]) 

如我所料,
arr3[0:3,1]應該返回相同的結果
arr3[0:3][1]array([[2, 2, 3],[4, 2, 3],[4, 2, 2],[2, 2, 2]])

但它返回:array([[1, 2, 3],[4, 2, 3],[1, 1, 1]])

順便說一句,我使用python3在Jupyter筆記本

回答

3

在做arr3[0:3,1],你在第一axis獲取元件從0:3,然後爲每個的,以第一element

這給出了一個不同的結果與arr3[0:3]服用0:3在第一軸線,然後從該axis取第一array

因此,在這種情況下,0:3部分不做任何事情在任何情況下爲array's形狀(3, 4, 3)因此服用first3只是給你回相同array。在第二種情況下,這絕對沒有任何效果,但在第一種情況下,它確實起到了佔位符的作用,因此您可以訪問第二個axis,但爲此您應該只使用冒號:[:, some_index]

看看它是如何相同的array

>>> arr3[0:3] 
array([[[1, 2, 3], 
     [1, 2, 3], 
     [1, 2, 3], 
     [1, 2, 3]], 

     [[2, 2, 3], 
     [4, 2, 3], 
     [4, 2, 2], 
     [2, 2, 2]], 

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

但是當你做arr3[:, 1]你正在服用從array第二axis第二個元素,這樣會給你:

array([[1, 2, 3], 
     [4, 2, 3], 
     [1, 1, 1]]) 

而在另一種情況下,你正在服用來自第一個axis的第二個元素的陣列如此:

array([[2, 2, 3], 
     [4, 2, 3], 
     [4, 2, 2], 
     [2, 2, 2]]) 

要進一步瞭解關於numpyindexing,請看this page on scipy

。記下直接適用於您的問題這個具體的描述:

當有至少一個切片(:),省略號(...)np.newaxis在指數(或陣列具有多個尺寸比有先進索引),那麼行爲可能會更復雜。它就像串聯索引結果對每個指標先進元素

+0

@kylechan請'accept'(灰色剔旁邊回答)和'upvote'如果您尚未完成 –

+0

!我第一次使用stackoverflow。感謝您的耐心 –

+0

@kylechan沒問題,這是一個措辭良好的新用戶的問題:) –

1

讓我們看一下我們的多維numpy的數組:

import numpy as np 
arr3=np.array([ 
    [ 
     [1,2,3],[1,2,3],[1,2,3],[1,2,3] 
    ],[ 
     [2,2,3],[4,2,3],[4,2,2],[2,2,2] 
    ],[ 
     [1,1,1],[1,1,1],[1,1,1],[1,1,1] 
    ] 
]) 
print(arr3[0:3,1]) 

返回:

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

這是有道理的,因爲我們正在提取行號1到3,我們只抓取第一列。

但是,arr3[0:3][1]返回從第0行到第3行的數組,然後選擇第二行(或行索引1)。

觀察:

print(arr3[0:3]) 

返回:

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

[[2 2 3] 
    [4 2 3] 
    [4 2 2] 
    [2 2 2]] 

[[1 1 1] 
    [1 1 1] 
    [1 1 1] 
    [1 1 1]]] 

它返回一個新的數組(這恰好是同我們目前的陣列,因爲我們剛纔問的所有行數組中) 。然後我們問第二行:

print(arr3[0:3][1]) 

返回:

[[2 2 3] 
[4 2 3] 
[4 2 2] 
[2 2 2]] 
+0

很多thx,你的版本真的很清楚! –