簡體   English   中英

Numpy多維數組索引交換軸順序

[英]Numpy multi-dimensional array indexing swaps axis order

我正在使用多維Numpy數組。 我注意到在使用其他索引數組訪問這些數組時會出現一些不一致的行為。 例如:

import numpy as np
start = np.zeros((7,5,3))
a     = start[:,:,np.arange(2)]
b     = start[0,:,np.arange(2)]
c     = start[0,:,:2]
print 'a:', a.shape
print 'b:', b.shape
print 'c:', c.shape

在這個例子中,我得到了結果:

a: (7, 5, 2)
b: (2, 5)
c: (5, 2)

這讓我很困惑。 為什么“b”和“c”的尺寸不一樣? 為什么“b”交換軸順序,而不是“a”?

由於大量的單元測試,我能夠圍繞這些不一致的方式設計我的代碼,但是理解正在發生的事情將會受到贊賞。

作為參考,我使用Python 2.7.3和Numpy 1.6.2通過MacPorts。

從語法上講,這看起來像是一種不一致,但從語義上講,你在這里做了兩件截然不同的事情。 ab定義中,您正在進行高級索引 ,有時稱為花式索引 ,它返回數據的副本。 c的定義中,您正在進行基本切片 ,它返回數據視圖。

為了區分它,有助於理解索引如何傳遞給python對象。 這里有些例子:

>>> class ShowIndex(object):
...     def __getitem__(self, index):
...         print index
... 
>>> ShowIndex()[:,:]
(slice(None, None, None), slice(None, None, None))
>>> ShowIndex()[...,:]
(Ellipsis, slice(None, None, None))
>>> ShowIndex()[0:5:2,::-1]
(slice(0, 5, 2), slice(None, None, -1))
>>> ShowIndex()[0:5:2,np.arange(3)]
(slice(0, 5, 2), array([0, 1, 2]))
>>> ShowIndex()[0:5:2]
slice(0, 5, 2)
>>> ShowIndex()[5, 5]
(5, 5)
>>> ShowIndex()[5]
5
>>> ShowIndex()[np.arange(3)]
[0 1 2]

如您所見,有許多不同的可能配置。 首先,可以傳遞單個項目,或者可以傳遞項目元組。 其次,元組可能包含slice對象, Ellipsis對象,普通整數或numpy數組。

傳遞intsliceEllipsis對象或None (與numpy.newaxis相同)等對象時,將激活基本切片。 這些可以單獨傳遞或者在元組中傳遞。 以下是文檔關於如何激活基本切片的說法:

當obj是切片對象(由start:stop:括號內的步驟符號構造),整數或切片對象和整數的元組時,會發生基本切片。 省略號和newaxis對象也可以穿插其中。 為了保持向后兼容Numeric中的常見用法,如果選擇對象是包含切片對象,Ellipsis對象或newaxis對象但沒有整數數組或其他的任何序列(例如列表),也會啟動基本切片。嵌入序列。

傳遞numpy數組,僅包含整數或包含任何類型子序列的非元組序列或包含數組或子序列的元組時,將激活高級索引。

有關高級索引和基本切片如何不同的詳細信息,請參閱文檔(鏈接到上面)。 但在這種特殊情況下,我很清楚發生了什么。 使用部分索引時,它與以下行為有關:

部分索引的規則是結果的形狀(或者在設置中使用的對象的解釋形狀)是x的形狀,其中索引子空間被廣播的索引子空間替換。 如果索引子空間彼此相鄰,則廣播的索引空間直接替換x中的所有索引子空間。 如果索引子空間是分開的(通過切片對象),則首先是廣播的索引空間,然后是x的切片子空間。

在您使用高級索引的a的定義中,您有效地將序列[0, 1]作為元組的第三項傳遞,並且由於沒有廣播發生(因為沒有其他序列),所有內容都按預期發生。

b的定義中,也使用高級索引,您可以有效地傳遞兩個序列[0] ,第一個項目(轉換為intp數組)和[0, 1] ,第三個項目。 這兩個項目一起廣播,結果與第三個項目具有相同的形狀。 然而,由於廣播已經發生,我們面臨一個問題:在新的形狀元組中我們插入廣播的形狀? 正如文檔所說,

沒有明確的地方可以放入索引子空間,因此它會被添加到開頭。

因此,廣播產生的2被移動到形狀元組的開頭,產生明顯的轉置。

暫無
暫無

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

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