2013-08-12 47 views
5

我很清楚地知道,there are differences between lists and tuplestuples aren't just constant lists,但也有其中兩個實際上是由代碼(由編碼約定反對)區別對待幾個例子,所以我(拖泥帶水)可以互換使用。列表和元組行爲不同

>>> import numpy as np 
>>> a = np.arange(9).reshape(3,3) 
>>> a 
array([[0, 1, 2], 
     [3, 4, 5], 
     [6, 7, 8]]) 
>>> idx = (1,1) 
>>> a[idx] 
4 
>>> idx = [1,1] 
>>> a[idx] 
array([[3, 4, 5], 
     [3, 4, 5]]) 

有人可以解釋什麼是怎麼回事:

那時,我發現,他們給完全不同的行爲的情況下,來的?更重要的是,這個陷阱在scipy中還會出現在哪裏呢?

回答

4

你得到一個不同的行爲,因爲在numpy的,三種類型的索引支持

  • 基本切片
  • 高級索引
  • 記錄訪問

使用元組索引是僅僅相當於一個參數列表,後綴爲Basic Slicing,其中使用非列表的結果將導致Advanced Indexing。

還記得,從documentation

高級索引被觸發時選擇對象obj是 非元組序列對象,ndarray(數據類型爲整數或布爾), 或元組至少包含一個序列對象或ndarray(數據類型爲 integer或bool)。有兩種類型的高級索引:整數 和布爾值。

高級索引始終返回數據的副本(與 基本切片對比,返回視圖)。

,而且,從相同的文檔

在Python,×[(EXP1,EXP2,...,EXPN)]爲等價於x [EXP1,EXP2, ..., EXPN];後者只是前者的語法糖。

+0

+1你的回答比較好,所以我刪除了我的答案。 – defuz