簡體   English   中英

Numpy數組索引行為

[英]Numpy array indexing behavior

我正在玩numpy數組索引並發現這種奇怪的行為。 當我使用np.arraylist索引時,它按預期工作:

 In[1]: arr = np.arange(10).reshape(5,2)
        arr[ [1, 1] ]
Out[1]: array([[2, 3],
               [2, 3]])

但是當我放置tuple ,它給了我一個元素:

 In[1]: arr = np.arange(10).reshape(5,2)
        arr[ (1, 1) ]
Out[1]: 3

還有一些這種奇怪的tuple vs list行為與arr.flat一起arr.flat

 In[1]: arr = np.arange(10).reshape(5,2)

 In[2]: arr.flat[ [3, 4] ]
Out[2]: array([3, 4])

 In[3]: arr.flat[ (3, 4) ]
Out[3]: IndexError: unsupported iterator index

我無法理解引擎蓋下發生了什么? 在這種情況下, tuplelist什么區別?

Python 3.5.2
NumPy 1.11.1

發生的事情被稱為花式索引或高級索引 使用切片或列表/數組進行索引之間存在差異。 訣竅在於,由於隱式元組語法,多維索引實際上與元組一起使用:

import numpy as np
arr = np.arange(10).reshape(5,2)
arr[2,1] == arr[(2,1)] # exact same thing: 2,1 matrix element

但是,在索引表達式中使用列表 (或數組)的行為會有所不同:

arr[[2,1]]

將索引到arr為1,然后用2,所以首先它取arr[2]==arr[2,:] ,然后arr[1]==arr[1,:] ,並返回這兩行(第2行)和行1)作為結果。

它變得更加有趣:

print(arr[1:3,0:2])
print(arr[[1,2],[0,1]])

第一個是常規索引,它將行1到2和0到1列包括在內; 給你一個2x2的子陣列。 第二個是花哨的索引,它在數組中給你arr[1,0],arr[2,1] ,即它使用索引列表的zip()選擇性地索引到你的數組中。

現在這就是為什么flat工作的原因:它會返回數組的flatiter 來自help(arr.flat)

class flatiter(builtins.object)
 |  Flat iterator object to iterate over arrays.
 |  
 |  A `flatiter` iterator is returned by ``x.flat`` for any array `x`.
 |  It allows iterating over the array as if it were a 1-D array,
 |  either in a for-loop or by calling its `next` method.

因此,來自arr.flat的結果迭代器表現為1d數組。 當你這樣做

arr.flat[ [3, 4] ]

你正在使用花式索引訪問該虛擬1d數組的兩個元素; 有用。 但是當你想要做的時候

arr.flat[ (3,4) ]

你試圖訪問1d(!)數組的(3,4)元素,但這是錯誤的。 這不會拋出IndexError的原因可能只是因為arr.flat本身處理這個索引的情況。

In [387]: arr=np.arange(10).reshape(5,2)

使用此列表,您將從arr中選擇2行

In [388]: arr[[1,1]]
Out[388]: 
array([[2, 3],
       [2, 3]])

它與您明確標記列切片(使用:或......)相同

In [389]: arr[[1,1],:]
Out[389]: 
array([[2, 3],
       [2, 3]])

使用數組而不是列表有效: arr[np.array([1,1]),:] (它也消除了一些含糊之處。)

使用tuple ,結果與編寫沒有元組包裝器的索引相同。 因此它選擇行索引為1,列索引為1的元素。

In [390]: arr[(1,1)]
Out[390]: 3
In [391]: arr[1,1]
Out[391]: 3

arr[1,1]由解釋器翻譯成arr.__getitem__((1,1)) 正如Python中常見的那樣, 1,1(1,1)簡寫。

arr.flat情況下,您將數組編入索引,就像它是1d一樣。 np.arange(10)[[2,3]]選擇2項,而np.arange(10)[(2,3)]是2d索引,因此是錯誤。

最近幾個問題涉及一個更加混亂的角落案件。 有時列表被視為元組。 討論可能具有啟發性,但如果令人困惑,就不要去那里。

傳遞列表時的高級切片而不是numpy中的元組

numpy索引:不應該落后省略號是多余的?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM