2016-06-21 160 views
3

我剛剛偶然發現了一個我不太明白的numpy索引行爲。看起來numpy正在改變我的座標軸的順序,這取決於索引模式。不幸的是,我無法在文檔中找到對以下內容的解釋。有人可以向我解釋發生了什麼事嗎?Numpy索引重新排列數組

# This is expected: dimension 1 is reduced to length 1: 
print np.ndarray(shape=(3,3,3,3))[:, [0], :, :].shape 
>>> (3, 1, 3, 3) 

# This is the unexpected behavior: 
print np.ndarray(shape=(3,3,3,3))[:, [0], :, 0].shape 
>>> (1, 3, 3) 

我期望第二個命令產生(3,1,3)。如果我從第四個角度選擇一個元素,爲什麼前兩個維度的形狀會發生變化? 非常感謝!

編輯: 我見到這對numpy的1.11.0與蟒蛇2.7.11

+1

儘管很晦澀,但這種行爲[記錄](http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#combining-advanced-and-basic-indexing)。 – 2016-06-21 09:37:26

回答

4

預期的行爲...... NumPy的治療用切片和使用數組索引的不同索引軸軸。默認行爲是生成的形狀將生成帶有數組索引的軸的結果形狀,然後生成帶切片索引的軸形狀。這意味着奇數出局是第一種情況,應該是(1, 3, 3, 3)。但有人認爲它會讓用戶對你的一些簡單情況感到困惑,所以當所有用數組索引的軸被分組在一起時,所得到的形狀被放置在輸出形狀的位置,其中數組索引軸的集羣位於原始數組。

你可以自己測試一下:

>>> print np.ndarray(shape=(3,3,3,3))[:, [0], [0], :].shape 
(3, 1, 3) 

正如你所經歷的,這個聰明比一致的行爲可能更加混亂。 NumPy開發人員之間的共識是,最好不要以不同的方式處理聚簇數組索引軸,並且甚至有可能允許這種更加明智的索引的a PR implementing indexer attributes

爲了向下兼容,默認索引不可能很快改變,儘管它可能會在不久的將來爲某些情況開始發佈棄用警告。