2017-11-25 77 views
2

的「相同」的部分我考慮一個numpy的數組:不同形狀的ndarray

import numpy as np 
b = np.empty((10,11,12)) 

現在我希望下面的形狀是相同的,但他們顯然不是:

>>> b[0,:,1].shape 
>>> (11,) 

>>> b[0][:][1].shape 
>>> (12,) 

有人可以給我解釋爲什麼形狀不同?我閱讀了關於編制索引的Numpy文檔,但是它表示編寫a[k][l]a[k,l]相同。

+0

但是,這並不適用於帶':'的'[:]'或表達式。 – hpaulj

+0

在第二步中,評估'temp = b [0]'。然後'temp1 = temp [:]',然後'temp1 [1]'。也就是說,單獨的索引操作。 'b [0,:,1]'是一個索引操作,通過'numpy'作爲一個整體進行評估。嘗試匹配這兩個操作並不總是有用。 – hpaulj

回答

4

發生這種情況是因爲b[0][:]b[0]的視圖,因此b[0][:][1]確實是b[0, 1, :]。一個數字例子可能有助於突出顯示發生了什麼:

In [5]: b = np.arange(3*4*5).reshape((3, 4, 5)) 

In [6]: b[0] 
Out[6]: 
array([[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19]]) 

In [7]: b[0, :] 
Out[7]: 
array([[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19]]) 

In [8]: b[0, :, 1] 
Out[8]: array([ 1, 6, 11, 16]) 

In [10]: b[0][:] 
Out[10]: 
array([[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19]]) 

In [11]: b[0][:][1] 
Out[11]: array([5, 6, 7, 8, 9]) 

In [13]: b[0, 1, :] 
Out[13]: array([5, 6, 7, 8, 9]) 

In [32]: b[0][:, 1] 
Out[32]: array([ 1, 6, 11, 16]) 
+0

我想我現在明白了。 [:]給出數組的一個副本,但以這種方式使用它:b [0,:,1]表示在第一維中選擇第0個位置,在第二個維中選擇第一個位置,在第三個維中選擇第一個位置,對? – user9007131

+0

除了一個普通的gotcha:與Python列表不同的是,'':''不會*淺拷貝'np.ndarray';相反,它給你一個原始數組的視圖:如果讓'c = b [:]'並更改'c'的任何部分,那麼'b'引用的內容也會改變。 – fuglede

+0

那麼當處理numpy數組時,什麼是[:]呢?我可以忽略它,並總是在上面的例子中得到相同的結果。 – user9007131