2013-10-06 30 views
2

我的問題是關於numpy中的數組切片。以下行爲的邏輯是什麼?numpy數組切片,爲什麼有時是二維數組,有時是一維數組

x = arange(25) 
x.shape = (5, 5) 
# This results in a 2-d array in which rows and columns are excerpted from x 
y = x[0:2, 0:2] 
# But this results in a 1-d array 
y2 = x[0:2, 0] 

我本來期望Y2是一個2-d數組,它包含行0和1的值,列0

+0

這是超級方便有像切片'y2'是一維數組,例如,如果你想拉出一個陣列的每一列繪製它或者通過額外的信號處理運行它,等。 – tacaswell

回答

3

這遵循標準的Python約定。看看這些類似的表達式的結果:

>>> a = [0, 1, 2, 3, 4, 5] 
>>> a[4] 
4 
>>> a[4:5] 
[4] 

正如你所看到的,一個返回一個項目,而其他的回報包含一個項目列表。這一直是python的工作方式,numpy只是遵循這個約定,但在更高維度上。無論何時傳遞片段而不是單個項目,都會返回一個列表;即使有列表中沒有的項目,這是真實的,要麼是因爲年底指數過低,或者因爲起始索引太高:

>>> a[4:4] 
[] 
>>> a[6:6] 
[] 

所以在所有情況下,通過一個片均值「返回序列(沿着給定維度)「,而傳遞整數意味着」返回單個項目(沿給定維度)「。

5

你可以得到你預期的行爲做x[0:2, 0:1],即用一個單一的項目片。但是,無論何時選擇單個元素,該維度都會摺疊。你可能不喜歡它,但是如果你仔細想一想,你應該意識到它是最一致的行爲:按照你的邏輯,x[0, 0]將是1行1列的二維數組,而不是存儲在位置。

2

當您使用單個元素而不是切片訪問數組時,它會摺疊該維度。因此,如果你有

x = arange(25) 
y = x[10] 

你會期望y10而不是array([10])

所以,如果你使用

y2 = x[0:2, 0] 
print y2.shape 
(2,) 

它會崩潰的第二個維度。如果要保留第二個維度,則需要使用切片訪問該維度。

y2 = x[0:2, 0:1] 
print y2.shape 
(2, 1) 
相關問題